【问题标题】:I am getting an __initerror我收到一个 __initerror
【发布时间】:2020-06-23 12:33:26
【问题描述】:

我正在尝试在屏幕上的特定位置放置一个问题横幅(作为 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

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

【问题讨论】:

  • 如果你不显示,我们怎么知道super(QuestionBanner, self)是什么?此外,我们甚至不确定是哪一行导致了错误,因为您没有在问题中包含完整的错误回溯。
  • @ThierryLathuille 嘿,谢谢,我添加了完整的回溯-您还需要查看什么?

标签: python firebase kivy kivy-language


【解决方案1】:

QuestionBanner 类的__init__() 中,您正在调用:

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

这会将你所有的kwargs 传递给超级__init__() 方法,而超级__init__() 不理解你在构造函数中传递的kwargs

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

因此,这些参数通过类似的super 调用传递,直到它到达不接受任何kwargsobject __init__(),因此它引发了Exception。解决方法是在调用super 之前,让QuestionBanner__init__() 删除那些kwargs。一种简单的方法是为kwargs 添加属性,如下所示:

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 并删除 @ 之前的那些 kwargs 987654343@电话。

【讨论】:

    猜你喜欢
    • 2021-04-23
    • 2022-06-12
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-30
    相关资源
    最近更新 更多