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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 16:36:09