Python3.8 Tkinter点击按钮报错:get_combo_choice缺失event、cmb必填参数
问题根因
- 参数适配错误:
get_combo_choice函数要求必须传入event(事件对象)、cmb(下拉框绑定变量)两个入参,但Tkinter的Button触发command回调时不会传递任何参数,直接绑定该函数就会触发缺少参数的报错。 - 逻辑场景不匹配:
get_combo_choice是为单个下拉框选中事件设计的处理逻辑,本身无法满足「批量获取所有下拉框选择结果」的按钮需求;另外你将按钮创建代码放在了遍历英雄的for循环中,会重复生成3个完全相同的按钮,属于冗余代码。
修复方案
拆分两个场景的处理逻辑:保留原有下拉框的选中事件处理函数,单独编写按钮对应的批量获取结果函数,同时把按钮创建逻辑移出循环。
import tkinter as tk from tkinter import ttk root = Tk() my_heroes = ['Zidane', 'Ronaldo', 'Messi'] position = ['The One!', 'more or less','the bad'] result =[None, None, None] best = [] # 原有下拉框选中事件处理函数,无需修改 def get_combo_choice(event, cmb): i = best.index(event.widget) result[i] = cmb.get() print('result-->', result) print('i-->', i) print('event.widget-->', event.widget) print('cmb.get-->', cmb.get()) print('result[i]-->', result[i]) # 新增按钮对应的批量获取结果函数 def get_all_choices(): # 直接遍历所有下拉框获取结果 all_result = [cmb.get() for cmb in best] print("所有下拉框选择结果:", all_result) return all_result for index, heroe in enumerate(my_heroes): var = tk.StringVar() bestPlayers = ttk.Combobox(root,values=position, textvariable=var, state="readonly") best.append(bestPlayers) bestPlayers.grid(row=0 + index, column=1,padx=(15,25)) label = tk.Label(root, text = heroe) label.grid(row=0 + index, column=0,padx=(15,25)) bestPlayers.bind("<<ComboboxSelected>>",lambda event, cmb=var: get_combo_choice(event, cmb)) # 按钮创建移到循环外,绑定新的回调函数 button = tk.Button(root, text ="get list of choices", command = get_all_choices) button.grid(row=4, column=0,padx=(15,25)) root.mainloop()
验证效果
修改后触发下拉框选中事件的原有逻辑保持正常,点击按钮即可在控制台输出所有下拉框的选择结果,不会再报参数缺失错误。
内容的提问来源于stack exchange,提问作者pkanda
相关产品推荐
相关产品推荐

