python - 我收到一个 __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
感谢任何可以对此有所了解的人!
解决方案
在您__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
删除那些。一种简单的方法是只添加这样的属性:kwargs
super
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
super
推荐阅读
- python - 通过numpy中的逻辑索引分配
- javascript - 修复 cmd.exe 位置后,npx create-react-app 原因不起作用
- python - 将文件上传到 S3 并使用 boto 设置其存储类
- c - OS X 内核将虚拟地址空间锁定到物理内存中
- java - DAO 接口:2 个实体(Java、Hibernate)的实现
- php - 为 Laravel 7 设置默认 Storage::disk()
- python - 多次运行一个pytests目录
- javascript - 使用Angular Select,选择值后,ng-model为null
- javascript - 有没有办法通过变量从对象中获取信息?
- visual-studio-code - 语法高亮突然不同