这里有一些简单的工作代码(来自StackOverflow通过sentdex):
import tkinter as tk
LARGE_FONT = ("Verdana", 12)
class App(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
tk.Tk.title(self, "This is App")
container = tk.Frame(self)
container.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (StartPage, PageOne):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky=tk.NSEW)
self.show_frame(StartPage)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
class StartPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
label = tk.Label(self, text="StartPage", font=LARGE_FONT)
label.pack(padx=10, pady=10)
button = tk.Button(self, text="Visit Page 1",
command=lambda: controller.show_frame(PageOne))
button.pack()
class PageOne(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
label = tk.Label(self, text="Page One!", font=LARGE_FONT)
label.pack(padx=10, pady=10)
button = tk.Button(self, text="Back to Home",
command=lambda: controller.show_frame(StartPage))
button.pack()
app = App()
app.mainloop()
现在我尝试将PageOne
(以及每个附加页面/ pagelogik)放入一个单独的文件中并将其作为模块导入,例如import <modulename> as <prefix>
。
当点击“第一页”上的按钮时,这就达到了这一点。 - 但随后它失败了,因为StartPage
在此文件中是未知的。
所以我自己弄清楚如何将StartPage
的引用传递给PageOne
。我想StartPage
文件中的循环导入PageOne
将是一个愚蠢的混乱。
答案 0 :(得分:2)
解决方案非常简单:make show_frame
接受页面名称作为字符串。然后,只有app类需要导入每个页面。然后它可以根据类名找到类的实例。