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

