Tkinter Combobox取值问题求助:无法获取combo_2值且无报错
问题分析与解决
错误原因
- 事件绑定语法错误:代码中使用了HTML转义字符
<<ComboboxSelected>>,Tkinter无法识别该事件标识,导致updating_lists内的if逻辑完全没有触发,combo_1选择后无法加载对应列表。 - 变量作用域问题:
combo_2和top_1是updating_lists函数的局部变量,update_values函数无法直接访问,因此选择combo_2时会触发“combo_2未定义”的错误。 - 主窗口变量未同步:
update_values里的variable_1是局部变量,无法同步到主窗口的StringVar,导致选择的值无法回显到主窗口标签。
修正方案
- 将事件绑定的转义字符替换为Tkinter原生的
<<ComboboxSelected>>,确保事件能被正确触发。 - 通过
event.widget获取combo_2实例,再用winfo_toplevel()获取顶级窗口,避免使用全局变量来传递控件引用。 - 在
update_values中直接修改主窗口的StringVar对象,实现选中值的回显。
修正后的代码
from tkinter import * from tkinter import ttk root = Tk() root.title('Example') root.geometry('415x415') starting_list = ['Option A', 'Option B'] # 全局StringVar,确保update_values可直接修改 main_var = StringVar(root, '') def updating_lists(event): list_A = ['A_1', 'A_2', 'A_3'] list_B = ['B_1', 'B_2', 'B_3'] final_list = [''] top_1 = Toplevel() top_1.title('This window should have an updated list') top_1.geometry('220x220') selected = event.widget.get() if selected == 'Option A': print('you have selected option A') final_list = list_A elif selected == 'Option B': print('you have selected option B') final_list = list_B combo_2 = ttk.Combobox(top_1, values=final_list, state='readonly') combo_2.pack() # 使用正确的事件标识绑定 combo_2.bind('<<ComboboxSelected>>', update_values) def update_values(event): # 通过event.widget获取当前操作的combo_2 selected_val = event.widget.get() print(f'combo_2 selected value: {selected_val}') # 更新主窗口的变量,实现回显 main_var.set(selected_val) # 获取并销毁弹出窗口 top_win = event.widget.winfo_toplevel() top_win.destroy() ########################################### # Frame A # ########################################### frame_A = LabelFrame(root, width=400, height=400, text='Example', padx=5, pady=5) frame_A.grid_propagate(0) frame_A.grid(row=0, column=0, padx=10, pady=5) combo_1 = ttk.Combobox(frame_A, values=starting_list, state='readonly', width=15) combo_1.set('Choose one') combo_1.grid(row=0, column=0) # 修正事件绑定语法 combo_1.bind('<<ComboboxSelected>>', updating_lists) label_1 = Label(frame_A, textvariable=main_var, padx=5, pady=5) label_1.grid(row=1, column=0) root.mainloop()
内容的提问来源于stack exchange,提问作者Eduardo
相关产品推荐
相关产品推荐

