Tkinter中实现Listbox项双击后显示到搜索输入框的问题
解决方案
要实现双击Listbox项填充到搜索Entry的功能,只需在你的OOP代码中做以下关键修改:
- 将StringVar改为实例变量:原
string1是方法内局部变量,后续事件处理函数无法访问,需改为self.string1。 - 给Listbox绑定双击事件:关联
<Double-Button-1>事件与自定义处理函数。 - 实现双击事件处理逻辑:获取选中项内容并设置到Entry对应的StringVar中。
修改后的完整代码
import re import tkinter as tk from tkinter import ttk from tkinter import * from PIL import Image, ImageTk root = tk.Tk() class Player: """Creating the information for the soccer 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.search_player() def search_player(self): """The main search window, this is where you will search for the player""" # 改为实例变量,方便事件函数访问 self.string1 = tk.StringVar() # Clears first frame for i in self.master.winfo_children(): i.destroy() # Create first frame self.frame1 = tk.Frame(self.master, width=500, height=300) self.frame1.pack() # Search Label self.search_label = tk.Label(self.master, text="Search Player:", font=("Times, 12")) self.search_label.place(x=15, y=50) # Entry for searching self.search_entry = tk.Entry(self.master, font=("arial, 15"),textvariable=self.string1) self.search_entry.place(x=125, y=50) # Search Button self.search_button = tk.Button(self.master, text="Search", font=("Times, 13"), command=lambda: self.player_info_screen()) self.search_button.place(x=360, y=47) # Listbox storing players name self.listbox1 = tk.Listbox(self.master,font=("Times, 12")) self.listbox1.place(x=125, y=100) # 绑定双击事件到处理函数 self.listbox1.bind("<Double-Button-1>", self.on_listbox_double_click) # Scroll bar for list box self.scrollbar = tk.Scrollbar(self.master) self.scrollbar.place(x=310, y=100) # Attaching listbox to scrollbar and scrollbar to listbox self.listbox1.config(yscrollcommand=self.scrollbar.set) self.scrollbar.config(command=self.listbox1.yview()) # list made up of each object instance showing players name footballer_names = [player1.name, player2.name, player3.name, player4.name] # Adding players into listbox for name in footballer_names: self.listbox1.insert(0, name) def on_listbox_double_click(self, event): # 获取选中项索引 selected_index = self.listbox1.curselection() if selected_index: # 获取选中的球员名字 player_name = self.listbox1.get(selected_index[0]) # 将名字填充到Entry中 self.string1.set(player_name) def player_info_screen(self): # 可在此补充球员详情页逻辑,原代码未实现,暂留空方法 pass player1 = Player("Neymar","Paris Saint Germain","10") player2 = Player("Lionel Messi","Inter Miami","30") player3 = Player("Kevin De Bruyne","Manchester City","17") player4 = Player("Cristiano Ronaldo", "Al Nassr", "7") window = Screen(root) root.geometry("500x400") root.mainloop()
关键修改说明
- 实例化StringVar:通过
self.string1让事件处理函数能直接修改Entry的显示内容。 - 绑定双击事件:用
bind方法将鼠标双击操作与处理函数关联,确保触发双击时执行对应逻辑。 - 处理双击逻辑:先通过
curselection()获取选中项的索引,再用get()提取内容,最后通过set()方法将内容填入Entry。
内容的提问来源于stack exchange,提问作者jclasen3
相关产品推荐
相关产品推荐

