Python Tkinter多窗口共享SQLite数据报'str'无法转整数错误如何解决
问题排查与解决方案
核心错误原因
你代码的核心问题是变量名冲突+传参逻辑错误,触发报错的直接原因:
- Tkinter内置的
END常量本质是字符串'end',你误把它传给了Python原生列表的insert()方法,而列表的insert第一个参数要求是整数索引,所以抛出'str' object cannot be interpreted as an integer错误 - 更深层的诱因是你重复使用
items作为变量名,同时用它指代Tkinter列表框控件、数据库查询结果列表、函数参数,导致逻辑混乱。
具体错误点拆解
- 函数参数逻辑错误
你原本设计fill_item_list函数应该接收两个参数:要填充的Tkinter列表框控件、待插入的数据集,但你现在只写了一个参数items,把查询到的数据集传进去后,函数内的items就变成了数据集列表,而非列表框控件。 - 全局变量被覆盖
你在item_list_view中执行items = app.manager.data_1.view()时,直接覆盖了全局作用域中原本指向Tkinter列表框控件的items变量,后续调用的都是字符串列表而非控件。
修复后的代码示例
1. 修正展示逻辑代码,分离参数避免变量名冲突
# 假设全局的列表框控件名修改为item_listbox,避免和数据集变量重名冲突 def clear_item_list(): item_listbox.delete(0, END) def fill_item_list(listbox_widget, data_list): for item_ in data_list: listbox_widget.insert(END, item_) def item_list_view(): clear_item_list() # 数据集变量改名,不要和控件名重复 query_result = app.manager.data_1.view() fill_item_list(item_listbox, query_result)
2. 确认数据库查询逻辑
确认app.manager.data_1.view()返回的是符合插入要求的元组/列表格式,如果返回的是单条字符串,需要先做格式化处理再传入列表框。
额外注意事项
你提供的数据库创建代码存在缩进错误,connect函数内部的代码需要统一缩进,且需要提前导入sqlite3模块,否则无法正常运行:
import sqlite3 def connect(): conn = sqlite3.connect("../database.db") cur = conn.cursor() cur.execute( "CREATE TABLE IF NOT EXISTS items (id INTEGER PRIMARY KEY , name text , price INTEGER )" ) conn.commit() conn.close() connect()
内容的提问来源于stack exchange,提问作者Mobin Bagheri
相关产品推荐
相关产品推荐

