You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python连接SQLite开发GUI时遇'sqlite3.Cursor'不可调用错误求助

解决SQLite Cursor对象不可调用的错误

你遇到的这个'sqlite3.Cursor' object is not callable错误,根源在run_query函数的返回语句上。让我帮你拆解一下问题:

当你调用cursor.execute(query, parameters)时,它返回的是一个sqlite3.Cursor对象,而不是一个可执行的函数。但你最后写了return query_result(),相当于试图把这个Cursor对象当成函数来调用,这自然会触发错误。

另外我还注意到一个小细节:你定义了全局变量db_name = 'database.db',但函数里却用了self.db_name,如果你的类里没有初始化这个属性,后续也可能出现引用问题,最好统一成类属性来管理。

修正后的代码

下面是调整好的run_query和viewing_records函数:

import sqlite3

class YourGUIClass:  # 替换成你实际的GUI类名
    def __init__(self):
        self.db_name = 'database.db'  # 将数据库名设为类属性,避免全局变量问题
        # 这里添加你的其他初始化逻辑,比如Tree控件的创建等

    def run_query(self, query, parameters=()):
        with sqlite3.connect(self.db_name) as conn:
            cursor = conn.cursor()
            cursor.execute(query, parameters)
            conn.commit()
            return cursor.fetchall()  # 使用fetchall()获取查询结果的所有行

    def viewing_records(self):
        # 清空Tree控件中的现有记录
        records = self.tree.get_children()
        for element in records:
            self.tree.delete(element)
        # 执行查询
        query = 'SELECT * FROM product ORDER BY name DESC'
        db_rows = self.run_query(query)
        # 将查询结果插入Tree控件
        for row in db_rows:
            self.tree.insert('', 0, text=row[1], values=row[2])

关键修改点

  • 将return query_result()改为return cursor.fetchall():fetchall()方法会返回查询结果的所有行,是一个可遍历的列表,完美适配后续的循环插入逻辑。
  • 把全局的db_name移到类的__init__方法中作为类属性,确保self.db_name能正确引用到数据库文件。
  • 移除了不必要的query_result变量,直接调用cursor.execute后获取结果,让代码更简洁。

这样修改后,再调用self.viewing_records()应该就能正常加载数据库记录到你的Tree控件里了。

内容的提问来源于stack exchange,提问作者Ela Tina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:40:06