Python - 从另一个类调用函数

时间:2016-06-02 03:55:47

标签: python tkinter

我刚开始学习Python,我最近阅读了一个关于使用tkinter切换窗口的教程。在教程中,该人使用lambda从__init__中的按钮内部切换窗口,但我想在切换窗口之前通过一个函数。该函数从类WindowA内部运行,需要调用类GLApp内的函数。运行该功能后,如果成功,它应该打开WindowB

如果我尝试从windowA中的函数内部调用show_frame,我会收到此错误。

--controller is not defined

有人可以解释实际从windowA函数中调用show_frame函数背后的思考过程,我很感激它!

class GLApp(tk.Tk):

    def __init__(self, *args, **kwargs):

            self.frames = {}

        for F in (WindowA, WindowB):

            frame = F(container, self)

            self.frames[F] = frame

            frame.grid(row=0, column=0, sticky="nsew")

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


class windowA(tk.Frame):

    def __init__(self, parent, controller):

        tk.Frame.__init__(self,parent)

        #window styling and function calling

        self.attempt_login = tk.Button(self,text="Login",command= self.function)

        def function(self):

             try:

                trysomething

             else:

                controller.show_frame(WindowB)

1 个答案:

答案 0 :(得分:1)

教程没有告诉你的是你应该保存一个控制器实例,以便你可以在页面类的每个函数中使用它。要查看为本教程复制的原始代码,请参阅https://stackoverflow.com/a/7557028/7432

在其中你会看到每个页面类的第一件事就是保存控制器。完成后,您可以在页面类的任何位置使用self.controller

此外,在您的代码中,您在function内嵌套__init__。在这种情况下,没有理由这样做。将函数移出一级,并按如下方式编写:

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

    def function(self):
         try:
            trysomething
         else:
            self.controller.show_frame(WindowB)