从 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())
我尝试了很多东西,但还是想不通,如果有人能帮忙,也许给我一个简短的解释,那就太好了!谢谢,祝你有美好的一天!
Page1
是 class
但你需要使用 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)
以后可以使用p1
、p2
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()
```
我在 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())
我尝试了很多东西,但还是想不通,如果有人能帮忙,也许给我一个简短的解释,那就太好了!谢谢,祝你有美好的一天!
Page1
是 class
但你需要使用 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)
以后可以使用p1
、p2
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()
```