如何使用.get()从CustomTkinter的CTkEntry获取条码查询MySQL
解决CustomTkinter输入框获取值查询MySQL的问题
你的代码主要有三个核心问题,导致UPC_entry.get()无法正确获取输入值完成查询:
问题分析
- 查询时机错误:你现在的查询代码在GUI初始化阶段就直接执行了,这时候用户还没在输入框中输入条码,
UPC_entry.get()拿到的是空值或占位符文本,自然会报错。 - 按钮绑定错误:你把SQL语句字符串
search传给了按钮的command参数,按钮点击需要触发的是一个函数,而非字符串。 - SQL参数化写法不规范:手动给
%s添加单引号是多余的,MySQL的参数化查询驱动会自动处理字符串转义和引号,手动加引号反而可能导致格式错误。
修正后的完整代码
import customtkinter import mysql.connector # 先完成数据库连接初始化(根据你的实际配置修改) mydb = mysql.connector.connect( host="你的数据库主机地址", user="数据库用户名", password="数据库密码", database="目标数据库名" ) mycursor = mydb.cursor() root = customtkinter.CTk() root.title("条码查询工具") # 创建输入框并添加到窗口布局 UPC_entry = customtkinter.CTkEntry(root, placeholder_text="Barcode") UPC_entry.pack(pady=10, padx=20) # 定义点击按钮后执行的查询函数 def search_barcode(): # 获取输入值并去除首尾空格(扫码可能带换行/空格) barcode = UPC_entry.get().strip() if not barcode: print("请输入条码内容") return # 正确的参数化SQL写法,无需给%s加单引号 query = "SELECT Description FROM doitbest WHERE PrimaryUPC = %s" try: # 参数用元组传递(单元素元组必须加逗号) mycursor.execute(query, (barcode,)) myresult = mycursor.fetchall() if myresult: # 直接取出描述文本,避免打印元组格式 for item in myresult: print(f"查询结果:{item[0]}") else: print("未找到该条码对应的信息") except Exception as e: print(f"查询出错:{str(e)}") # 创建查询按钮,绑定查询函数 select_button = customtkinter.CTkButton(root, text="Search", command=search_barcode) select_button.pack(pady=5) root.mainloop()
关键修正说明
- 将查询逻辑封装到
search_barcode函数中,按钮点击时才触发查询,此时UPC_entry.get()能正确获取用户输入的条码。 - 用
strip()处理输入值,避免扫码时带入的空格/换行导致查询失败。 - 采用标准的参数化查询写法,既避免SQL注入风险,也能保证参数格式正确。
- 添加空值判断和异常捕获,方便快速排查输入错误或数据库连接问题。
- 补充了
pack()布局方法,确保输入框和按钮能显示在窗口上(原代码可能遗漏了这一步)。
内容的提问来源于stack exchange,提问作者user23604742
相关产品推荐
相关产品推荐

