Tkinter中如何将Combobox选中的MS-SQL数据库名存入变量
Tkinter Combobox选中数据库名存入变量解决方案
问题根因
你的代码存在两处核心问题导致无法拿到预期的存储值:
print(dbname)执行时机错误:master.mainloop()是Tk的事件循环启动方法,会阻塞主线程直到窗口关闭,你写在它前面的打印逻辑会在窗口还未渲染、用户还未进行任何点击操作时就执行,此时dbname还是初始的空字符串- Combobox选项值格式错误:从数据库查询返回的
rows是元组构成的列表,你转换得到的final_result是列表套列表结构,直接赋值给Combobox的values属性会导致每个选项显示为['库名']的格式,取值也会携带多余的括号符号
修复后的完整代码
import pymssql from tkinter import StringVar,Tk,ttk, Button, Label from sqlalchemy import create_engine def get_dbname(event): # 直接从绑定的StringVar取值,不需要声明全局变量 dbname = db_name_var.get() label_dbname["text"] = dbname # 后续需要用dbname的逻辑直接写在这里即可 print("当前选中的数据库名:", dbname) master = Tk() # 声明StringVar绑定Combobox,自动同步选中值 db_name_var = StringVar() engine = create_engine('mssql+pymssql://(local)') result = engine.execute("select name FROM sys.databases;") rows = result.fetchall() # 直接提取元组第一个元素,得到纯库名字符串列表 final_result = [i[0] for i in rows] db_select = ttk.Combobox(master, state = 'readonly', textvariable=db_name_var) db_select['values'] = final_result db_select.current(0) db_select.grid(row = 0, column = 0) # 可选优化:不需要点按钮,选中Combobox选项自动更新值 # db_select.bind("<<ComboboxSelected>>", get_dbname) label_dbtitle = Label(master, text = "chosen db = ") label_dbtitle.grid(row = 1, column = 0) label_dbname = Label(master, text = "?") label_dbname.grid(row = 1, column = 1) buttn1 = Button(master, text = 'Button1') buttn1.bind("<Button-1>",get_dbname) buttn1.grid(row = 2, column = 0) master.mainloop()
关键修改说明
- 修正了数据库返回值的处理逻辑,直接提取纯字符串的库名列表,避免选项显示异常
- 用
StringVar绑定Combobox的textvariable属性,自动同步选中值,不需要依赖全局变量 - 将取值、后续使用
dbname的逻辑移到按钮点击的回调函数中,保证在用户操作完成后才执行,能拿到最新的选中值 - 如果不需要点击按钮触发,可以直接给Combobox绑定
<<ComboboxSelected>>事件,选中选项就自动触发取值逻辑
内容的提问来源于stack exchange,提问作者Gaurav Agrawal
相关产品推荐
相关产品推荐

