Python PySimpleGui中Combobox取sqlite表值附带元组特殊字符问题
问题原因
cursor.fetchall() 返回的查询结果是元组列表,即使只查询product_name单个字段,每条记录也会以('Lemon',)、('Orange',)这种单元素元组的格式返回。你直接把这个元组列表传给Combobox作为下拉选项,选中后拿到的值自然是带括号、单引号、尾逗号的元组字符串,不是纯产品名称。
修复方案
1. 提前提取纯产品名称字符串
修改find_product()函数,从查询返回的元组里提取出纯字符串值,再传给Combobox:
def find_product(): conn = sqlite3.connect('controller.db') cursor = conn.cursor() cursor.execute("SELECT product_name FROM products ORDER BY product_name ") # 提取每个元组的第一个元素,组成纯字符串列表 data = [row[0] for row in cursor.fetchall()] cursor.close() conn.close() print(data) return data
修改后Combobox的所有选项都是纯产品名字符串,选中后values['-PRODUCT_NAME-']直接就是干净的名称值,不需要额外做字符串裁剪。
2. 修正数据插入逻辑
原代码里create_files()和update()函数给数值字段加了多余括号,也没做类型转换,把两个函数里的data_new赋值部分替换为:
data_new = (values['-PRODUCT_NAME-'], float(values['-QUANTITY-']), float(values['-TOTAL_VALUE-']))
不需要再给values['-PRODUCT_NAME-']套str()转换,修改后拿到的本身就是字符串类型。
3. 修复原代码隐藏bug
原update()函数里执行完cursor.execute()和conn.commit()就马上关闭了游标,之后再读取cursor.rowcount会触发游标已关闭的错误,把cursor.close()挪到所有数据库操作完成之后再执行即可。
内容的提问来源于stack exchange,提问作者Sid_Romano
相关产品推荐
相关产品推荐

