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

如何从Tkinter Combobox获取选中值?Python开发问题求助

Tkinter Combobox选中值无法获取的问题

我是Python和Tkinter新手,用Tkinter构建用户输入界面时遇到问题:通过Combobox选择的变量无法被获取并用于后续代码。代码最后一行print(Setup.company)无法输出选中的公司名称,尝试print(Setup.company_dropdown.get())和print(Setup.company.get())均报错。

相关代码如下:

class ResModelInput:

    def __init__(self):
        param_window = Tk()
        param_window.title("Parameters")

        ttk.Label(param_window, text="Company:", font="Calibri 12").grid(row=1, column=1, sticky=W)
        ttk.Label(param_window, text="Valuation date (dd/mm/yyyy):", font="Calibri 12").grid(row=4, column=1, sticky=W)
        # outputs
        ttk.Label(param_window, text="Valuation Year:", font="Calibri 12").grid(row=5, column=1, sticky=W)
        ttk.Label(param_window, text="Valuation Month:", font="Calibri 12").grid(row=6, column=1, sticky=W)
        ttk.Label(param_window, text="Valuation Quarter:", font="Calibri 12").grid(row=7, column=1, sticky=W)

        # variables to store input
        self.company = StringVar()
        self.ValDt = StringVar()

        # variables for output
        self.ValYr = StringVar()
        self.ValMnth = StringVar()
        self.ValQrt = StringVar()

        company_dropdown = ttk.Combobox(state="readonly", textvariable=self.company, values=CmpnTbl['CmpnLst'].tolist())
        company_dropdown.grid(row=1, column=2, padx=(0, 5))
        self.company = company_dropdown.get()

        ttk.Entry(param_window, textvariable=self.ValDt,
                  justify=RIGHT, font="Calibri 12").grid(row=4, column=2, padx=(0, 5))

        ttk.Label(param_window, textvariable=self.ValYr,
                  font="Calibri 12 bold", justify=RIGHT).grid(row=5, column=2, sticky=E)
        ttk.Label(param_window, textvariable=self.ValMnth,
                  font="Calibri 12 bold", justify=RIGHT).grid(row=6, column=2, sticky=E)
        ttk.Label(param_window, textvariable=self.ValQrt,
                  font="Calibri 12 bold", justify=RIGHT).grid(row=7, column=2, sticky=E)

        Button(param_window, text="Calculate",
               command=self.param_calc, font="Calibri 12").grid(row=16, column=1, padx=(100, 5), pady=5)

        Button(param_window, text="Close",
               command=param_window.quit, font="Calibri 12").grid(row=16, column=2, padx=(100, 5), pady=5)

        param_window.mainloop()

    def param_calc(self):

        ValDt = datetime.strptime(self.ValDt.get(), '%d/%m/%Y').date()
        ValYr = ValDt.year
        ValMnth = ValDt.month
        ValQrt = "Q4"

        self.ValYr.set(str(ValYr))
        self.ValMnth.set(str(ValMnth))
        self.ValQrt.set(ValQrt)


Setup = ResModelInput()
print(Setup.ValYr.get()) # 这行能正常输出
print(Setup.company) # 即使选了内容也没有输出

尝试过以下代码,均报错:

print(Setup.company_dropdown.get())
print(Setup.company.get())

问题原因及解决办法

  1. 核心问题1:覆盖了StringVar对象
    你一开始将self.company定义为StringVar(),但紧接着用self.company = company_dropdown.get()把它改成了初始化时的空字符串(此时用户还未选择内容),直接丢失了和Combobox的绑定关系,后续自然无法获取实时选中值。

  2. 核心问题2:Combobox未作为实例属性保存
    company_dropdown是局部变量,不属于类的实例属性,所以外部无法通过Setup.company_dropdown访问它。

修复步骤:

  • 删除self.company = company_dropdown.get()这行代码,保留self.company作为StringVar()对象,它会自动和Combobox绑定,实时同步选中值。
  • 若需要直接操作Combobox控件,将其设为实例属性:self.company_dropdown = ttk.Combobox(...),而非局部变量。

修改后的关键代码片段:

# 保留StringVar的定义,不要覆盖
self.company = StringVar()

# 将Combobox设为实例属性
self.company_dropdown = ttk.Combobox(state="readonly", textvariable=self.company, values=CmpnTbl['CmpnLst'].tolist())
self.company_dropdown.grid(row=1, column=2, padx=(0, 5))
# 移除 self.company = company_dropdown.get() 这行

获取选中值的正确方式:

之后在任何位置(包括窗口关闭后),都可以通过以下方式获取选中值:

print(Setup.company.get())  # 通过绑定的StringVar获取
# 或者如果保存了Combobox实例:
print(Setup.company_dropdown.get())  # 通过控件直接获取

内容的提问来源于stack exchange,提问作者pantzoulinos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 04:52:50