Tkinter无需选择按钮 将Listbox选中数据传递到另一窗口标签的实现方法
实现思路
你只需要调整3处逻辑就能实现需求:
- 把
NewWindow类里的Label从局部变量改成实例属性,方便外部调用修改文本 - 主窗口新增变量保存打开的子窗口实例,避免重复创建窗口同时能访问子窗口控件
- 修改Listbox的选中回调逻辑,判断子窗口存在时同步更新子窗口的Label内容
调整后的完整可运行代码
import tkinter as tk from tkinter import Toplevel, Label, Button, Tk class NewWindow(Toplevel): def __init__(self, master = None): super().__init__(master = master) self.title("信息广播窗口") self.geometry("200x200") # 将Label改为实例属性,方便外部访问修改 self.display_label = Label(self, text ="等待接收信息...") self.display_label.pack() master = Tk() master.geometry("200x300") master.title("控制窗口") label = Label(master, text ="这是主窗口选中内容") label.pack(side = "top", pady = 10) # 主窗口保存子窗口实例的变量 child_window = None def open_new_window(e): global child_window # 避免重复打开子窗口 if child_window is None or not child_window.winfo_exists(): child_window = NewWindow(master) btn = Button(master, text ="点击打开信息广播窗口") btn.bind("<Button>", open_new_window) btn.pack(pady = 10) listbox = tk.Listbox(master) listbox.pack(side="top", fill="both", expand=True) listbox.insert("end", "one", "two", "three", "four", "five") def callback(event): global child_window selection = event.widget.curselection() if selection: index = selection[0] data = event.widget.get(index) # 更新主窗口Label label.configure(text=data) # 子窗口存在且未关闭时,同步更新子窗口Label if child_window is not None and child_window.winfo_exists(): child_window.display_label.configure(text=data) else: label.configure(text="") if child_window is not None and child_window.winfo_exists(): child_window.display_label.configure(text="") listbox.bind("<<ListboxSelect>>", callback) master.mainloop()
关键修改说明
- 新增
child_window全局变量保存子窗口实例,通过winfo_exists()方法判断窗口是否还处于打开状态,避免操作已关闭的窗口报错 - 子窗口的Label命名为
display_label作为实例属性,主窗口可以直接调用configure方法修改文本 - 选中Listbox选项时
<<ListboxSelect>>事件会自动触发回调,不需要额外加选择按钮,选中内容会实时同步到两个窗口的Label中
内容的提问来源于stack exchange,提问作者KAI-YU LIEN
相关产品推荐
相关产品推荐

