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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 14:45:03