Python / Tkinter Lambda事件参数问题

时间:2018-04-19 02:26:21

标签: python python-3.x tkinter

我一直试图调用函数showframe,这需要两个aurgument。当我从HomePage中的Button命令调用它时显示错误。 TypeError:showframe()缺少1个必需的位置参数:'frame_name'我无法理解为什么?由于我按类名称调用它应该自动获取self,然后frame_name将获得SignIn类。但那没有发生。

class Culpture(Frame):
    def __init__(self, root):
        Frame.__init__(self, root)
        fhome = HomePage(root)
        fsignin = SignIn(root)
        self.showframe(fhome)
        fhome.grid(row=0, column=0, sticky='nsew')
        fsignin.grid(row=0, column=0, sticky='nsew')
        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)

    def showframe(self, frame_name):
        frame_name.tkraise()
class HomePage(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)
        Label(self, text="Homepage").grid()
        Button(self, text='SignIn', command=lambda: Culpture.showframe(SignIn), width=20).grid()

如果我这样做,

Button(self, text='SignIn', command=lambda: Culpture.showframe(parent, SignIn), width=20).grid()

然后它显示另一条错误消息。 TypeError:tkraise()缺少1个必需的位置参数:'self' 所以我试着看一些问题我得到了一个是接近我的解决方案Python/Tkinter Event Argument Issue 但不一样。如果我尝试另一种方式 Button(self, text='SignIn', command=lambda: Culpture.showframe(parent, SignIn(parent)), width=20).grid()然后它显示没有错误,但按钮不会打开新框架。

class SignIn(Frame):
def __init__(self, parent):
    Frame.__init__(self, parent)
    Label(self, text="SignIn").grid()
    Button(self, text='Submit', width=20).grid()

如果你们中的任何人能帮助我,那将会非常有帮助。

2 个答案:

答案 0 :(得分:1)

在代码中的某处,您需要创建Culpture的实例。您需要使用该实例来调用show_frame。执行此操作时,实例将自动作为self参数传递,您传递的参数将为frame_name

culpture = Culpture(root)
...
culpsure.show_frame(fsignin)

您没有显示创建Culpture实例的位置,因此很难比这更具体。

答案 1 :(得分:1)

你做错了事。理想情况下,您应该为不同的页面创建不同的类,这将使代码更简洁。

因此,为SignIn创建一个不同的类,为home创建另一个类。

以下是用python3编写的:

<application>

如果这不起作用,请告诉我。 另外,要添加更多页面:

如果它们是互连的 - 将类的名称添加到同一个循环中。

如果他们连接到某个共同的页面 - 使用名称制作一个新的lop。