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

如何在Tkinter二级窗口指定输入框中显示球员对象属性

解决Tkinter足球球员详情页信息填充问题

以下是修改后的完整代码,实现了点击搜索后将选中球员的姓名、球队、号码填充到详情页输入框的功能:

import tkinter as tk
from tkinter import messagebox
from PIL import Image, ImageTk


root = tk.Tk()

class Player:
    """创建足球球员信息类"""
    def __init__(self,name,team,number):
        self.name = name
        self.team = team
        self.number = number

class Screen:
    def __init__(self,master):
        self.master = master
        # 统一存储所有球员对象,并建立姓名与对象的映射
        self.players = [
            Player("Neymar","Paris Saint Germain","10"),
            Player("Lionel Messi","Inter Miami","30"),
            Player("Kevin De Bruyne","Manchester City","17")
        ]
        self.player_map = {p.name: p for p in self.players}
        self.search_player()

    def search_player(self):
        """主搜索页面"""
        # 清空当前窗口所有组件
        for i in self.master.winfo_children():
            i.destroy()
        
        self.string1 = tk.StringVar()
        self.frame1 = tk.Frame(self.master, width=500, height=300)
        self.frame1.pack()

        # 搜索栏组件
        self.search_label = tk.Label(self.master, text="搜索球员:", font=("Times", 12))
        self.search_label.place(x=15, y=50)

        self.search_entry = tk.Entry(self.master, font=("arial", 15), textvariable=self.string1)
        self.search_entry.place(x=125, y=50)

        # 搜索按钮,触发跳转至详情页逻辑
        self.search_button = tk.Button(self.master, text="搜索", font=("Times", 13), 
                                       command=self.go_to_player_info)
        self.search_button.place(x=360, y=47)

        # 球员列表框
        self.listbox1 = tk.Listbox(self.master,font=("Times", 12))
        self.listbox1.place(x=125, y=100)

        # 滚动条绑定
        self.scrollbar = tk.Scrollbar(self.master)
        self.scrollbar.place(x=310, y=100)
        self.listbox1.config(yscrollcommand=self.scrollbar.set)
        self.scrollbar.config(command=self.listbox1.yview())

        # 填充球员姓名到列表
        for player in self.players:
            self.listbox1.insert(tk.END, player.name)

        # 列表选择事件绑定
        self.listbox1.bind('<<ListboxSelect>>', self.print_selection)

    def print_selection(self, event):
        """将选中的球员姓名显示到搜索框"""
        value = self.listbox1.get(self.listbox1.curselection())
        self.string1.set(value)

    def go_to_player_info(self):
        """获取选中球员,跳转至详情页"""
        selected_name = self.string1.get()
        if selected_name in self.player_map:
            self.player_info_screen(self.player_map[selected_name])
        else:
            messagebox.showwarning("提示", "未找到该球员")

    def player_info_screen(self, player):
        """球员详情页面,填充球员信息"""
        # 清空当前窗口所有组件
        for i in self.master.winfo_children():
            i.destroy()
        
        self.frame3 = tk.Frame(self.master, width=500, height=300)
        self.frame3.pack()

        screen_label2 = tk.Label(self.master, text="球员信息页:", font=("Arial", 14))
        screen_label2.place(x=175,y=10)

        # 姓名输入框填充
        name_label = tk.Label(self.master,text="姓名:", font=("Arial", 12))
        name_label.place(x=15,y=75)
        name_entry = tk.Entry(self.master,font=("Arial", 12))
        name_entry.place(x=70, y=77)
        name_entry.insert(0, player.name)
        name_entry.config(state=tk.DISABLED)  # 设置为不可编辑

        # 球队输入框填充
        team_name_label = tk.Label(self.master,text="球队:", font=("Arial", 12))
        team_name_label.place(x=15,y=115)
        team_name_entry = tk.Entry(self.master,font=("Arial", 12))
        team_name_entry.place(x=70,y=117)
        team_name_entry.insert(0, player.team)
        team_name_entry.config(state=tk.DISABLED)

        # 号码输入框填充
        number_label = tk.Label(self.master, text="号码:", font=("Arial", 12))
        number_label.place(x=15,y=155)
        number_entry = tk.Entry(self.master, font=("Arial", 12))
        number_entry.place(x=80,y=157)
        number_entry.insert(0, player.number)
        number_entry.config(state=tk.DISABLED)

        player_image_label = tk.Label(self.master, text="球员图片:", font=("Arial", 12))
        player_image_label.place(x=340,y=50)

        # 返回搜索页按钮
        back_btn = tk.Button(self.master, text="返回搜索", command=self.search_player)
        back_btn.place(x=200, y=250)


window = Screen(root)
root.geometry("500x400")
root.mainloop()

关键改动说明

  • 统一管理球员对象:在Screen类初始化时,将所有球员实例存入列表并建立姓名映射,避免分散管理导致的查找困难。
  • 新增跳转逻辑:通过go_to_player_info方法获取选中的球员姓名,查找对应的Player对象后传递给详情页。
  • 详情页信息填充:修改player_info_screen方法接收球员对象参数,使用insert方法将球员属性填充到对应输入框,并设置输入框为不可编辑状态。
  • 优化交互体验:添加未找到球员的提示框,以及返回搜索页的按钮,提升用户操作流畅度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 00:23:14