初始化 kivy 屏幕时遇到困难,TypeError: __init__() 需要 1 个位置参数,但给出了 2 个

Posted

技术标签:

【中文标题】初始化 kivy 屏幕时遇到困难,TypeError: __init__() 需要 1 个位置参数,但给出了 2 个【英文标题】:Difficulty initialising a kivy screen, TypeError: __init__() takes 1 positional argument but 2 were given 【发布时间】:2020-05-17 00:14:05 【问题描述】:

如果有人可以帮助我,我将不胜感激。我正在尝试将kivy 屏幕初始化为另一个kivy 屏幕,这是我遇到的问题,我尝试了不同的方法来初始化它,但我一直收到错误代码。我想我的GUI 的设置方式与我有关,但我不确定。我最新的错误代码是这样的:

TypeError: __init__() 接受 1 个位置参数,但给出了 2 个

我一直在尝试不同的方法来初始化 ApplyPage 中的 ProjectListScreen。有人可以帮助确定我做错了什么,我将不胜感激。以下是我的代码:

class ProjectListScreen(Screen):
    project_list = ObjectProperty(None)
    def __init__(self, **kwargs):
        super(ProjectListScreen, self).__init__(**kwargs)
        self.thelocalId = None
        self.placementtext = None

projectlistscreen = ProjectListScreen()

class ApplyPage(Screen):

    def __init__(self, **kwargs):
        super(ApplyPage, self).__init__(**kwargs)
        self.projectlistscreen = projectlistscreen
        self.yes = Button(text="Yes", font_size = 20, font_name= "fonts/Qanelas-Heavy.otf", background_color = (0.082, 0.549, 0.984, 1.0), background_normal= '', pos_hint = "x":0.1,"y":0.05, size_hint= [0.2, 0.1])
        self.add_widget(self.yes)
        self.no = Button(text="No", font_size= 20, font_name= "fonts/Qanelas-Heavy.otf", background_color = (0.082, 0.549, 0.984, 1.0), background_normal= '', pos_hint = "x":0.7, "y":0.05, size_hint= [0.2, 0.1])
        self.add_widget(self.no)

    def on_enter(self, *args):
        print(self.projectlistscreen.placementtext)

class MyApp(App):
    refresh_token_file = "refresh_token.txt"
    members_list = "members_list.txt"




    def build(self):
        self.refresh_token_file = self.user_data_dir + self.refresh_token_file
        self.thefirebase = MyFireBase()
        self.projectlistscreen = ProjectListScreen()
        self.apply = ApplyPage(self.projectlistscreen)



        return sm



sm = Builder.load_file("kivy.kv")

if __name__ == "__main__":
    MyApp().run()

以下是我的完整回溯

回溯(最近一次通话最后一次): 文件“/Users/tmitayoadefemi/PycharmProjects/test5/mainfile.py”,第 871 行,在 MyApp().run() 文件“/Users/temitayoadefemi/PycharmProjects/test5/venv/lib/python3.7/site-packages/kivy/app.py”,第 800 行,运行中 根 = self.build() 文件“/Users/tmitayoadefemi/PycharmProjects/test5/mainfile.py”,第 860 行,在构建中 self.apply = ApplyPage(self.projectlistscreen) TypeError: init() 接受 1 个位置参数,但给出了 2 个

【问题讨论】:

这能回答你的问题吗? TypeError: method() takes 1 positional argument but 2 were given @UlrichEckhardt :我认为这不是关于类实例self 的问题,而是关于*args**kwargs 之间的区别 【参考方案1】:

参数*args 和关键字参数**kwargs 之间存在差异。 当您调用self.apply = ApplyPage(self.projectlistscreen) 时,您为__init__ 函数提供了两个参数:类实例selfself.projectlistscreen,但该函数只需要类实例self + 最终的关键字参数。

这里有一个更好理解的例子:

def myfun1(**kwargs):
    print(kwargs)

myfun1(3)
# TypeError: myfun() takes 0 positional arguments but 1 was given

def myfun2(**kwargs):
    print(kwargs)

myfun2(foobar=3)
# 'foobar': 3

def myfun3(*args):
    print(args)

myfun3(3)
# (3,)

def myfun4(*args):
    print(args)

myfun4(foobar=3)
#TypeError: myfun() got an unexpected keyword argument 'foobar'

所以你有2个选择来解决你的问题:

def __init__(self, *args):

或者

self.apply = ApplyPage(foobar=self.projectlistscreen)

【讨论】:

谢谢兄弟,但问题太多,所以我使用 Factory 进行实例化,您是否知道在实例化为 None 后访问在另一个类中初始化的实例

以上是关于初始化 kivy 屏幕时遇到困难,TypeError: __init__() 需要 1 个位置参数,但给出了 2 个的主要内容,如果未能解决你的问题,请参考以下文章

如何传递一个值来初始化 Kivy 中的屏幕小部件?

我只想将来自 kivy 的 MapView 放在我的应用程序的屏幕中,通过初始菜单上的按钮访问

使用 kivy 和 python 返回屏幕管理器时未设置焦点

Kivy Python-文本输入框填充整个浮动布局屏幕

Kivy/Python 文本输入焦点

移除或更换启动时的 kivy 闪屏