如何将GUI类拆分为单独的文件/模块?

时间:2015-12-11 12:21:07

标签: user-interface oop python-3.x tkinter

这里有一些简单的工作代码(来自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将是一个愚蠢的混乱。

1 个答案:

答案 0 :(得分:2)

解决方案非常简单:make show_frame接受页面名称作为字符串。然后,只有app类需要导入每个页面。然后它可以根据类名找到类的实例。