如何在Tkinter多窗口应用中点击PageOne按钮在PageTwo生成对应标签
问题原因
你报错的核心原因是将PageTwo类直接作为Label的父组件传入,Tkinter要求父组件必须是已经完成实例化的控件对象,PageTwo作为类本身不包含运行时的tk相关属性,因此触发AttributeError。
解决思路
你的代码中已经通过MyPages类的self.frames字典存储了所有页面的实例化对象,只需要通过全局控制器controller访问到PageTwo的实例,就能对它的控件进行操作。推荐提前在PageTwo中预留消息展示标签,避免动态创建控件带来的布局混乱问题。
修改后的完整代码
import tkinter as tk from tkinter import ttk class MyPages(tk.Tk): def __init__(self, *args, **kwargs): tk.Tk.__init__(self, *args, **kwargs) container = tk.Frame(self) container.pack(side="top", fill="both", expand = True) self.frames = {} for F in (PageOne, PageTwo): frame = F(container, self) self.frames[F] = frame frame.grid(row=0, column=0, sticky="nsew") self.show_frame(PageOne) def show_frame(self, cont): frame = self.frames[cont] frame.tkraise() class PageOne(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self,parent) # 存储全局控制器,方便后续跨页面调用 self.controller = controller title_label = tk.Label(self, text="This is page one", font=("Verdana", 12)) title_label.pack(pady=10,padx=10) navigate_button = ttk.Button(self, text="Page Two", command=lambda: controller.show_frame(PageTwo)) navigate_button.pack(side = tk.LEFT) message_button = ttk.Button(self, text="Message button", command= self.message_fun) message_button.pack(side = tk.LEFT) def message_fun(self): # 拿到PageTwo的实例对象 page_two = self.controller.frames[PageTwo] # 修改PageTwo预留的消息标签文本 page_two.message_label.config(text='I want this message in page two') # 如果需要动态创建标签可以用下面的代码,不推荐重复点击重复创建 # message_label = tk.Label(page_two, text='I want this message in page two', font=("Verdana", 12)) # message_label.pack(side = tk.LEFT) class PageTwo(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) title_label = tk.Label(self, text="This is page two", font=("Verdana", 12)) title_label.pack(pady=10,padx=10) # 预留消息展示标签,初始为空 self.message_label = tk.Label(self, font=("Verdana", 12)) self.message_label.pack(side = tk.LEFT, padx=10) navigate_button = ttk.Button(self, text="Page one", command=lambda: controller.show_frame(PageOne)) navigate_button.pack(side = tk.LEFT) app = MyPages() app.mainloop()
关键修改点说明
- 给PageOne新增实例属性
self.controller存储全局控制器,用于跨页面访问其他页面实例 - 给PageTwo提前预留消息展示标签
self.message_label,避免多次点击按钮重复创建标签 - 修改
message_fun方法,通过self.controller.frames[PageTwo]获取已经实例化的PageTwo对象,直接修改其标签的文本内容即可
内容的提问来源于stack exchange,提问作者Jimmy
相关产品推荐
相关产品推荐

