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
相关产品推荐
相关产品推荐

