You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 06:21:01