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

Tkinter实现Combobox选Trainer自动填充对应球队教练姓名

Tkinter 三下拉框联动自动填充教练信息实现

实现逻辑拆解

不需要额外添加触发按钮,直接绑定下拉框的选中事件即可完成需求,核心执行流程如下:

  • 给身份选择框(Figure)绑定ttk组件自带的<<ComboboxSelected>>虚拟事件,用户完成下拉选择后会自动触发绑定的处理函数
  • 处理函数运行第一步先做前置校验:确认赛事选择框、球队选择框均已选中有效值,任意一项未选直接终止逻辑,避免读取数据时报错
  • 校验通过后判断当前选中的身份是否为Trainer,不是则直接返回;是则先清空名字、姓氏两个输入框的原有内容,再从预存的赛事-球队映射字典中读取对应球队的教练名和姓氏,分别填入对应输入框
  • 按照示例规则,选中Premier League、Manchester City、Trainer时,会自动在名字输入框填入Pep,姓氏输入框填入Guardiola

完整可运行参考代码

import tkinter as tk
from tkinter import ttk

# 预存赛事-球队-教练基础数据
league_db = {
    "Premier League": {
        "Manchester City": {"first_name": "Pep", "last_name": "Guardiola"},
        "Manchester United": {"first_name": "Erik", "last_name": "ten Hag"},
        "Liverpool": {"first_name": "Jurgen", "last_name": "Klopp"}
    },
    "La Liga": {
        "Real Madrid": {"first_name": "Carlo", "last_name": "Ancelotti"},
        "Barcelona": {"first_name": "Xavi", "last_name": "Hernandez"}
    },
    "Serie A": {
        "Inter Milan": {"first_name": "Simone", "last_name": "Inzaghi"}
    }
}

def on_tournament_select(event):
    """赛事选中后联动更新球队下拉选项"""
    selected_t = tournament_cb.get().strip()
    # 清空原有球队选择和输入框内容
    team_cb.set("")
    first_name_entry.delete(0, tk.END)
    last_name_entry.delete(0, tk.END)
    # 加载对应赛事的球队列表
    if selected_t in league_db:
        team_cb["values"] = list(league_db[selected_t].keys())

def on_figure_select(event):
    """身份选中后触发教练信息填充逻辑"""
    # 前置校验:必须选完赛事和球队
    selected_t = tournament_cb.get().strip()
    selected_team = team_cb.get().strip()
    selected_figure = figure_cb.get().strip()
    if not selected_t or not selected_team:
        return
    # 仅选中Trainer时执行填充
    if selected_figure != "Trainer":
        return
    # 先清空输入框旧内容
    first_name_entry.delete(0, tk.END)
    last_name_entry.delete(0, tk.END)
    # 填入对应教练信息
    coach_info = league_db[selected_t][selected_team]
    first_name_entry.insert(0, coach_info["first_name"])
    last_name_entry.insert(0, coach_info["last_name"])

# 初始化主窗口
root = tk.Tk()
root.title("球队信息查询")
root.geometry("350x220")

# 布局控件
ttk.Label(root, text="Tournament:").grid(row=0, column=0, padx=10, pady=10, sticky="w")
tournament_cb = ttk.Combobox(root, values=list(league_db.keys()), state="readonly")
tournament_cb.grid(row=0, column=1, padx=10, pady=10)
tournament_cb.bind("<<ComboboxSelected>>", on_tournament_select)

ttk.Label(root, text="Team:").grid(row=1, column=0, padx=10, pady=10, sticky="w")
team_cb = ttk.Combobox(root, state="readonly")
team_cb.grid(row=1, column=1, padx=10, pady=10)

ttk.Label(root, text="Figure:").grid(row=2, column=0, padx=10, pady=10, sticky="w")
figure_cb = ttk.Combobox(root, values=["Player", "Trainer", "Staff"], state="readonly")
figure_cb.grid(row=2, column=1, padx=10, pady=10)
figure_cb.bind("<<ComboboxSelected>>", on_figure_select)

ttk.Label(root, text="First Name:").grid(row=3, column=0, padx=10, pady=10, sticky="w")
first_name_entry = ttk.Entry(root)
first_name_entry.grid(row=3, column=1, padx=10, pady=10)

ttk.Label(root, text="Last Name:").grid(row=4, column=0, padx=10, pady=10, sticky="w")
last_name_entry = ttk.Entry(root)
last_name_entry.grid(row=4, column=1, padx=10, pady=10)

root.mainloop()

关键说明

  • 所有下拉框设置state="readonly",避免用户手动输入非法值导致字典匹配失败
  • 切换赛事时会自动清空已选球队和输入框内容,避免出现跨赛事数据不匹配的问题
  • 校验逻辑放在事件处理函数最前端,从根源上避免空值读取触发的KeyError异常

内容的提问来源于stack exchange,提问作者user18313765

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:09:26