在Tkinter绑定事件中识别触发回调的Combobox方法咨询
如何在Tkinter中识别触发事件的Combobox组件(共用回调函数)
其实你已经离答案很近了——event.widget就是触发事件的那个Combobox实例!你可以通过几种简单的方式来区分不同的Combobox,下面给你具体的解决方案和代码示例:
方法1:给Combobox添加自定义标识属性
最直观的方式就是在创建每个Combobox时,给它加一个自定义的属性(比如索引、名称等),这样在回调里直接通过event.widget就能拿到这个标识:
def Open_settings_Form(): def callbackFunc(event): # 获取触发事件的Combobox的自定义索引 combo_index = event.widget.my_index selected_value = event.widget.get() print(f"第 {combo_index} 个Combobox选中了: {selected_value}") # 这里也可以直接操作该组件,同步更新SETTINGS SETTINGS['LOG_Order'][combo_index] = event.widget.current() global SETTINGS Settings_Form = Toplevel(Main_Form) Settings_Form.title("LOG Settings") Settings_Form.geometry('900x300') labelTop = Label(Settings_Form, text = "Log Parsing Order") labelTop.grid(column=0, row=0) # 创建第一个Combobox并添加自定义索引 combo0 = ttk.Combobox(Settings_Form, state="readonly", values=Log_Fields) combo0.my_index = 0 # 自定义属性,标记这是第0个Combobox combo0.bind("<<ComboboxSelected>>", callbackFunc) combo0.current(SETTINGS['LOG_Order'][0]) combo0.grid(column=0, row=1) # 第二个Combobox同理 combo1 = ttk.Combobox(Settings_Form, state="readonly", values=Log_Fields) combo1.my_index = 1 combo1.bind("<<ComboboxSelected>>", callbackFunc) combo1.current(SETTINGS['LOG_Order'][1]) combo1.grid(column=1, row=1) # combo2、combo3按照同样的方式添加my_index属性即可
方法2:用functools.partial传递组件本身作为参数
如果你不想给组件加自定义属性,可以用functools.partial来包装回调函数,在绑定时直接把对应的Combobox实例传进去:
首先需要导入functools模块:
import functools
然后修改你的代码:
def Open_settings_Form(): # 调整回调函数,第一个参数接收触发事件的Combobox def callbackFunc(combo, event): selected_index = combo.current() selected_value = combo.get() # 比如通过grid的列号区分组件 column = combo.grid_info()['column'] print(f"列 {column} 的Combobox选中了: {selected_value}") SETTINGS['LOG_Order'][column] = selected_index global SETTINGS Settings_Form = Toplevel(Main_Form) Settings_Form.title("LOG Settings") Settings_Form.geometry('900x300') labelTop = Label(Settings_Form, text = "Log Parsing Order") labelTop.grid(column=0, row=0) combo0 = ttk.Combobox(Settings_Form, state="readonly", values=Log_Fields) # 用partial把combo0作为第一个参数传给回调 combo0.bind("<<ComboboxSelected>>", functools.partial(callbackFunc, combo0)) combo0.current(SETTINGS['LOG_Order'][0]) combo0.grid(column=0, row=1) combo1 = ttk.Combobox(Settings_Form, state="readonly", values=Log_Fields) combo1.bind("<<ComboboxSelected>>", functools.partial(callbackFunc, combo1)) combo1.current(SETTINGS['LOG_Order'][1]) combo1.grid(column=1, row=1) # combo2、combo3同理绑定
方法3:利用组件的内置属性区分
你也可以直接用Combobox的内置属性来识别它,比如winfo_name()(组件的Tk内部名称)或者grid_info()返回的布局位置:
def callbackFunc(event): combo = event.widget # 获取组件的Tk内部名称 print(f"触发事件的组件名称: {combo.winfo_name()}") # 获取组件的grid布局位置 grid_info = combo.grid_info() print(f"组件位于列 {grid_info['column']},行 {grid_info['row']}") # 同样可以直接操作该组件 selected_value = combo.get()
总结一下:你之前已经在使用event.widget.current(),这其实就是在操作触发事件的那个Combobox,只是你没意识到event.widget本身就是那个组件实例,通过上面的方法,就能轻松区分不同的Combobox啦!
内容的提问来源于stack exchange,提问作者GurhanCagin
相关产品推荐
相关产品推荐

