Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 在python中使用lambda表达式调用另一个类的方法_Python 3.x_Oop_Tkinter_Lambda - Fatal编程技术网

Python 3.x 在python中使用lambda表达式调用另一个类的方法

Python 3.x 在python中使用lambda表达式调用另一个类的方法,python-3.x,oop,tkinter,lambda,Python 3.x,Oop,Tkinter,Lambda,我正在尝试创建一个包含多个页面的小GUI。第一页上有一个按钮,用于弹出第二页并更改第二页上的标签文本。但是,我没有调用第二页的方法,该方法应该更改文本。有人能告诉我,为什么调用该方法时出现以下错误:SecondPage.changelab() TypeError:changeLabel()缺少1个必需的位置参数:“self” 更新: import tkinter as tk class ExampleApp(tk.Tk): def __init__(self, *args,

我正在尝试创建一个包含多个页面的小GUI。第一页上有一个按钮,用于弹出第二页并更改第二页上的标签文本。但是,我没有调用第二页的方法,该方法应该更改文本。有人能告诉我,为什么调用该方法时出现以下错误:
SecondPage.changelab()

TypeError:changeLabel()缺少1个必需的位置参数:“self”

更新:

    import tkinter as tk


class ExampleApp(tk.Tk):

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

        tk.Tk.__init__(self, *args, **kwargs)

        container = tk.Frame(self)
        container.pack()

        self.frames = {}

        for F in (FirstPage, SecondPage):

            frame = F(container, self)

            self.frames[F] = frame

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

    def show_frame(self, cont):

        frame = self.frames[cont]
        frame.tkraise()

    def get_page(self, frame_class):
        return self.frames[frame_class]


class FirstPage(tk.Frame):


    def __init__(self, parent, controller):

        tk.Frame.__init__(self, parent)

        page = controller.get_page(SecondPage)

        self.buttonFP = tk.Button(self, text="Next Page",
                                  command=lambda : [f for f in [page.changeLabel(),
                                                                controller.show_frame(SecondPage)]])
        self.buttonFP.pack()



class SecondPage(tk.Frame):

    def __init__(self, parent, controller):

        tk.Frame.__init__(self, parent)

        self.label = tk.Label(self, text="Test")

        self.label.pack()


    def changeLabel(self):
        """change text of label"""

        newLabel = "changed"
        self.label.configure(text=newLabel)




if __name__ == "__main__":
    app = ExampleApp()
    app.mainloop()

出现错误是因为您试图对类而不是类的实例调用该方法

因为您的体系结构有一个控制器,所以您可以修改控制器,使其具有一个返回页面实例的函数。然后可以使用实例调用该页面上的方法

例如:

class ExampleApp(tk.Tk):
    ...
    def get_page(self, frame_class):
        return self.frames[frame_class]
稍后,您可以使用此方法获取页面的实例,并使用该实例调用该方法:

page = self.controller.get_page(SecondPage)
page.changeLabel()

谢谢你的回复。出于某种原因,当我在lamda函数中创建一个类实例并调用其方法(如
controller.get\u page(SecondPage).changelab()时,您的代码才起作用。否则我会收到一个
键错误:
你知道这可能是什么原因吗?@Max2603:在创建页面之前,你可能正在调用
get\u page
。我用你的建议更新了上面的代码。我在FirstPage类中创建了实例。创建类实例的标准方法是什么?@Max2603:您的代码不会在FirstPage类中创建实例。实例是在循环中创建的,在这一行:
frame=F(container,self)
。在用户单击按钮之前,不应尝试获取页面。为此,您不应该使用
lambda
。只需创建一个普通函数并让按钮调用该函数。谢谢,我会这样做的!