return self.func(* args)TypeError:menu()缺少1个必需的位置参数:' self'

时间:2017-12-06 14:21:54

标签: python python-3.x tkinter

我一直收到这个错误,我似乎无法修复它,如果有人能帮助我,我会非常感激。我现在已经看了很长一段时间了,我似乎无法理解它,我仍然很擅长以面向对象的方式进行编程。

谢谢&圣诞快乐

欢迎页面

from External_Menu import *
from tkinter import *


class Welcome(Frame):

def __init__(self, root):
    Frame.__init__(self, root)
    self.welcome_button()
    self.pack()

def welcome_button(self):
    self.welcome = Button(self, text="Welcome!", command=ExternalMenu.menu)
    self.welcome.pack()
    self.pack()


if __name__ == "__main__":
    root = Tk()
    main = Welcome(root)
    main.mainloop()

外部菜单

from tkinter import *

class ExternalMenu(Frame):

def __init__(self, root):
    Frame.__init__(self, root)
    self.menu()
    self.pack()

def menu(self):
    self.external_menu_lbl = Label(self, text="External Menu", font=("", 26))
    self.external_menu_lbl.pack()

    self.sign_in_button = Button(self, text="Sign In")
    self.sign_in_button.pack()

    self.sign_up_button = Button(self, text="Sign Up")
    self.sign_up_button.pack()

    self.pack()

1 个答案:

答案 0 :(得分:0)

您的menu是一个方法,因此它需要一个可以操作的对象才能工作。但是你试图在没有为它创建的对象的情况下调用它,基本上你就像一个函数一样调用它。首先,您需要创建定义方法的类的对象:

an_ex_men = ExternalMenu(root)

然后您就可以在menu上调用an_ex_men方法:

an_ex_men.menu()

但是,由于您已经在menu的{​​{1}}方法下调用ExternalMenu,因此只要创建该类的对象实例,就会调用它。很快,您创建一个__int__对象就足以实现它,即使没有将它放到变量中以便稍后引用:

ExternalMenu

由于您要在两个窗口之间切换,因此您需要一个额外的方法来隐藏或完全销毁另一个窗口。假设您要销毁另一个窗口,为此您可以使用为您的按钮定义的方法来执行这两个操作:

ExternalMenu(root)

如:

def welcome(self):
    self.destroy()
    ExternalMenu(root)

下面的示例完全符合您的预期,首先我创建了一个父类... def welcome_button(self): self.welcome = Button(self, text="Welcome!", command=self.welcome) self.welcome.pack() def welcome(self): self.destroy() ExternalMenu(root) ... ,因为根据您的情况,您拥有的两个框架处于同一层次结构中,并且拥有父框架在我看来更好的结构:

App