如何在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
相关产品推荐
相关产品推荐

