Python 3.x 在python中使用lambda表达式调用另一个类的方法
我正在尝试创建一个包含多个页面的小GUI。第一页上有一个按钮,用于弹出第二页并更改第二页上的标签文本。但是,我没有调用第二页的方法,该方法应该更改文本。有人能告诉我,为什么调用该方法时出现以下错误: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,
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
。只需创建一个普通函数并让按钮调用该函数。谢谢,我会这样做的!