繁体   English   中英

如何从另一个 class 中引用我的 Tkinter“根”实例?

[英]How do I reference my Tkinter "root" instance from within another class?

我正在使用下面的代码创建一个 window 并提高不同的框架。 我需要创建一个顶层,但我试图让顶层 window 出现在主 window 的范围内。 环顾四周,我发现这样做的方法是使用 wm_transient(root)。 问题是我的“根”被称为应用程序,它不能从我调用这些函数的 class 中访问。

因此,我正在调用我的弹出窗口 function,我试图使我的弹出窗口(顶层)具有 wm_transient 的属性,但我必须将 master 设置为 root(我的应用程序中的应用程序)并且无法弄清楚如何使它工作。

所以我的基本问题是如何使顶层出现在我的主要 window 的范围内,但我真正想知道的是如何调用/引用我的根 window。

import tkinter as tk

class APP1(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        self.title('APP')
        self.geometry("552x700")
        self.resizable(False, False)

        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}

        self.frames["MenuPage"] = MenuPage(parent=container, controller=self)
        self.frames["MenuPage"].grid(row=0, column=0, sticky="nsew")
        self.show_frame("MenuPage")

    def show_frame(self, page_name):
        frame = self.frames[page_name]
        frame.tkraise()

class MenuPage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller

        def popup():
            x = tk.Toplevel(self)
            x.wm_transient(app)

        template = tk.Button(self, text='Popup', height=3, width=20, bg='white', font=('12'), command=lambda: popup())
        template.pack(pady=50)


if __name__ == "__main__":
    app = APP1()
    app.mainloop()

在您的具体示例中,您已经有两种访问“root”的方法。

首先,您的根是app ,即APP1的实例,它是一个全局变量,因此它已经在任何地方都可用。 它是全局的,因为您在 function 或 class 的上下文之外定义它。

其次,将APP1的实例作为controller参数传递到MenuPage class 中。 您将其保存为self.controller ,因此任何需要APP1实例的地方都可以使用self.controller

有关了解您复制的代码的更多帮助,请参阅在 tkinter 中的两个帧之间切换,其中包含许多有关此代码的问题的链接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM