从 class Page2 Tkinter 调用 class Page1

Call class Page1 from class Page2 Tkinter

我在 Whosebug (linked here) 上找到了一个 post,测试起来非常酷,但我终究无法弄清楚如何显示第 1 页,来自例如第 2 页。通常这是通过 MainView class 完成的,但我不想这样。

代码如下:

#Thanks to Bryan Oakley
class Page(Frame):
    def __init__(self, *args, **kwargs):
        Frame.__init__(self, *args, **kwargs)
    def show(self):
        self.lift()

class Page1(Page):
   def __init__(self, *args, **kwargs):
       Page.__init__(self, *args, **kwargs)
       label = Label(self, text="This is page 1").pack(side="top", fill="both", expand=True)

class Page2(Page):
   def __init__(self, *args, **kwargs):
       Page.__init__(self, *args, **kwargs)
       label = Label(self, text="This is page 3").pack(side="top", fill="both", expand=True)
       showp1 = Page1.show(root)
       b1 = Button(self, text="Page 1",font='Helvetica 15 bold italic', command=showp1,bg='#444444',fg='white',padx=20)
       b1.pack()

class MainView(Frame):
    def __init__(self, *args, **kwargs):
        Frame.__init__(self, *args, **kwargs)
        
        p1 = Page1(self)
        p2 = Page2(self)

我尝试从第 2 页调用的一些内容:

Page1.show(root)
Page1.show(self)
Page1.show(Mainview(Root))
Page1.show(Page())

我尝试了很多东西,但还是想不通,如果有人能帮忙,也许给我一个简短的解释,那就太好了!谢谢,祝你有美好的一天!

Page1class 但你需要使用 instance - p1

这需要用self

分配实例
class MainView(Frame):
    def __init__(self, *args, **kwargs):
        Frame.__init__(self, *args, **kwargs)
        
        self.p1 = Page1(self)
        self.p2 = Page2(self)

稍后在页面中使用

self.master.p1.show()

self.master.p2.show()

如果您不想通过 MainView 执行此操作,则必须将实例分配给 global 变量 - 但这种方法不是首选。

# default value at start 
#p1 = None
#p2 = None

class MainView(Frame):
    def __init__(self, *args, **kwargs):
        Frame.__init__(self, *args, **kwargs)
     
        global p1
        global p2

        p1 = Page1(self)
        p2 = Page2(self)

以后可以使用p1p2

p1.show()

p2.show()

编辑:

第一个版本的最小工作示例:

我不得不在单独的函数 change() 中使用 self.master.p2 因为我不能在 __init__ 中直接使用它,因为当我创建 p1 然后它会尝试访问self.master.p2 尚不存在 - 这会引发错误。如果我在函数中使用它,那么当我按下按钮时它会尝试访问 self.master.p2 - 而 self.master.p2 已经存在。

import tkinter as tk


class Page(tk.Frame):
    
    def show(self):
        self.lift()


class Page1(Page):
    
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
       
        label = tk.Label(self, text="This is page 1")
        label.pack(side="top", fill="both", expand=True)

        b1 = tk.Button(self, text="Show Page 2", command=self.change)
        b1.pack()

    def change(self):
        self.master.p2.show()
        
class Page2(Page):
    
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
       
        label = tk.Label(self, text="This is page 2")
        label.pack(side="top", fill="both", expand=True)
 
        b1 = tk.Button(self, text="Show Page 1", command=self.change)
        b1.pack()

    def change(self):
        self.master.p1.show()


class MainView(tk.Frame):
    
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        
        self.p1 = Page1(self)
        self.p1.grid(row=0, column=0, sticky='news')
        
        self.p2 = Page2(self)
        self.p2.grid(row=0, column=0, sticky='news')

        self.p1.show()

# --- main ---

root = tk.Tk()

main = MainView(root)
main.pack()

root.mainloop()
```