首页 > 解决方案 > 我收到一个 __initerror

问题描述

我正在尝试将问题横幅(作为 MDGridLayout)放在屏幕上的特定位置,以便通过我的 FireBase 加载问题。

我得到错误:

Traceback (most recent call last):
   File "C:/Users/user/PycharmProjects/GOAT/main.py", line 124, in <module>
     NavDrawerAndScreenManagerApp().run()
   File "C:\Users\user\PycharmProjects\GOAT\venv\lib\site-packages\kivy\app.py", line 949, in run
     self._run_prepare()
   File "C:\Users\user\PycharmProjects\GOAT\venv\lib\site-packages\kivy\app.py", line 944, in _run_prepare
     self.dispatch('on_start')
   File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "C:/Users/user/PycharmProjects/GOAT/main.py", line 103, in on_start
     Q = QuestionBanner(side_i_1=question['side_i_1'], side_n_1=question['side_n_1'])
   File "C:\Users\user\PycharmProjects\GOAT\questionsbanner.py", line 10, in __init__
     super(QuestionBanner, self).__init__(**kwargs)
   File "C:\Users\user\PycharmProjects\GOAT\venv\lib\site-packages\kivy\uix\gridlayout.py", line 256, in __init__
     super(GridLayout, self).__init__(**kwargs)
   File "C:\Users\user\PycharmProjects\GOAT\venv\lib\site-packages\kivy\uix\layout.py", line 76, in __init__
     super(Layout, self).__init__(**kwargs)
   File "C:\Users\user\PycharmProjects\GOAT\venv\lib\site-packages\kivymd\uix\behaviors\backgroundcolorbehavior.py", line 150, in __init__
     super().__init__(**kwargs)
   File "C:\Users\user\PycharmProjects\GOAT\venv\lib\site-packages\kivy\uix\widget.py", line 350, in __init__
     super(Widget, self).__init__(**kwargs)
   File "kivy\_event.pyx", line 245, in kivy._event.EventDispatcher.__init__
 TypeError: object.__init__() takes exactly one argument (the instance to initialize)

这是我的 main.py 相关代码(我认为最后两行是错误的来源,就好像我将它们注释掉(#)一样,应用程序运行):

    my_questions_grid = self.root.ids['my_questions_grid']
    questions = data['questions']
    # iterate through the firebase dictionaries
    for question_num, question in questions.items():
        # populate Home screen
        Q = QuestionBanner(side_i_1=question['side_i_1'], side_n_1=question['side_n_1'])
        my_questions_grid.add_widget(Q)

这是我的 QuestionsBanner file.py 相关代码:

def __init__(self, **kwargs):
    super(QuestionBanner, self).__init__(**kwargs)

    # Up - question text

    # Left side
    left = MDFloatLayout()
    left_image = Image(source='photos/' + kwargs['side_i_1'], size_hint=(1, 0.8), pos_hint={'top': 1, 'left': 1})
    left_label = MDLabel(text=kwargs['side_n_1'], size_hint=(1, 0.2), pos_hint={'top': 0.2, 'left': 1})
    left.add_widget(left_image)
    left.add_widget(left_label)

    self.add_widget(left)

以下是相关的 main.kv 代码:

MDTabs:
    pos_hint: {'top': .5, 'left': 1}
    size_hint: 1, .4
    id: android_tabs
    on_tab_switch: app.on_tab_switch(*args)
    Tab:
        text: "My Questions"
        MDGridLayout:
            id: my_questions_grid

感谢任何可以对此有所了解的人!

标签: pythonfirebasekivykivy-language

解决方案


在您__init__()QuestionBanner班级中,您正在致电:

super(QuestionBanner, self).__init__(**kwargs)

它将您的所有内容传递kwargs给 super__init__()方法,并且该 super__init__()不理解您kwargs在构造函数中传递的内容:

Q = QuestionBanner(side_i_1=question['side_i_1'], side_n_1=question['side_n_1'])

因此,这些 args 通过类似super的调用传递,直到它到达object __init__()不接受任何kwargs的 ,因此它引发了Exception。解决方法是让你的__init__()for在你打电话之前QuestionBanner删除那些。一种简单的方法是只添加这样的属性:kwargssuperkwargs

class QuestionBanner(MDGridLayout):
    side_i_1 = ObjectProperty(None)
    side_n_1 = ObjectProperty(None)

    def __init__(self, **kwargs):
        super(QuestionBanner, self).__init__(**kwargs)

        # Up - question text

        # Left side
        left = MDFloatLayout()
        left_image = Image(source='photos/' + kwargs['side_i_1'], size_hint=(1, 0.8), pos_hint={'top': 1, 'left': 1})
        left_label = MDLabel(text=kwargs['side_n_1'], size_hint=(1, 0.2), pos_hint={'top': 0.2, 'left': 1})
        left.add_widget(left_image)
        left.add_widget(left_label)

        self.add_widget(left)

此代码可能不正确,因为您尚未向我们提供所有相关代码,但Properties使用所需名称定义某种类型将在调用之前自动设置Properties和删除这些。kwargssuper


推荐阅读