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

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,导致选择的值无法回显到主窗口标签。

修正方案

  1. 将事件绑定的转义字符替换为Tkinter原生的<<ComboboxSelected>>,确保事件能被正确触发。
  2. 通过event.widget获取combo_2实例,再用winfo_toplevel()获取顶级窗口,避免使用全局变量来传递控件引用。
  3. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 14:35:19