[英]Kivy: AttributeError: '...' object has no attribute '...', but it has
我有这个带有一些按钮、TexInput 等的TaskTemplate
。我将只放一段代码以便于理解。
class TaskTemplate(BoxLayout, Button):
task_name = StringProperty()
def __init__(self):
super(TaskTemplate, self).__init__()
self.update_state = 'down'
<TaskTemplate>:
RelativeLayout:
CheckBox:
state: root.update_state
如果我使用TaskTemplate
作为它的根类,我可以使用该参数更改 CheckBox 的状态。
如果我在这里添加TaskTemplate
:
MainScreen:
<MainScreen>:
BoxLayout:
ScrollView:
GridLayout:
id: here_add_task_template
我得到这个没有尽头的错误:
Traceback (most recent call last):
File "C:\Users\barbu\OneDrive\Desktop\Final App 2\venv\lib\site-packages\kivy\lang\builder.py", line 240, in create_handler
return eval(value, idmap), bound_list
File "C:\Users\barbu\OneDrive\Desktop\Final App 2\middleScreen.kv", line 122, in <module>
state: root.update_state
File "kivy\weakproxy.pyx", line 32, in kivy.weakproxy.WeakProxy.__getattr__
AttributeError: 'TaskTemplate' object has no attribute 'update_state'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\barbu\OneDrive\Desktop\Final App 2\venv\lib\site-packages\kivy\lang\builder.py", line 694, in _apply_rule
value, bound = create_handler(
File "C:\Users\barbu\OneDrive\Desktop\Final App 2\venv\lib\site-packages\kivy\lang\builder.py", line 243, in create_handler
raise BuilderException(rule.ctx, rule.line,
kivy.lang.builder.BuilderException: Parser: File "C:\Users\barbu\OneDrive\Desktop\Final App 2\middleScreen.kv", line 122:
...
120:# root.update_index()
121:# root.save_in_json(self)
>> 122: state: root.update_state
123:
124: Button:
...
AttributeError: 'TaskTemplate' object has no attribute 'update_state'
File "C:\Users\barbu\OneDrive\Desktop\Final App 2\venv\lib\site-packages\kivy\lang\builder.py", line 240, in create_handler
return eval(value, idmap), bound_list
File "C:\Users\barbu\OneDrive\Desktop\Final App 2\middleScreen.kv", line 122, in <module>
state: root.update_state
File "kivy\weakproxy.pyx", line 32, in kivy.weakproxy.WeakProxy.__getattr__
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\barbu\OneDrive\Desktop\Final App 2\main.py", line 246, in <module>
MainApp().run()
File "C:\Users\barbu\OneDrive\Desktop\Final App 2\venv\lib\site-packages\kivy\app.py", line 955, in run
runTouchApp()
File "C:\Users\barbu\OneDrive\Desktop\Final App 2\venv\lib\site-packages\kivy\base.py", line 574, in runTouchApp
EventLoop.mainloop()
File "C:\Users\barbu\OneDrive\Desktop\Final App 2\venv\lib\site-packages\kivy\base.py", line 341, in mainloop
self.window.mainloop()
File "C:\Users\barbu\OneDrive\Desktop\Final App 2\venv\lib\site-packages\kivy\core\window\window_sdl2.py", line 757, in mainloop
if self.dispatch('on_key_down', key,
File "kivy\_event.pyx", line 727, in kivy._event.EventDispatcher.dispatch
您的update_state
只是TaskTemplate
的一个实例变量。 所以在你的kv
中使用state: root.update_state
只是设置CheckBox
的初始state
。 更改该变量不会对CheckBox
产生影响。 如果您希望CheckBox
反映对update_state
值的更改,那么您有两种选择。
update_state
的值时,该代码将更新CheckBox
。update_state
更改为Property
。 然后kv
将添加绑定以在update_state
更改时更新CheckBox
。为了实现上面的#2,只需更改:
class TaskTemplate(BoxLayout, Button):
task_name = StringProperty()
def __init__(self):
super(TaskTemplate, self).__init__()
self.update_state = 'down'
至:
class TaskTemplate(BoxLayout, Button):
update_state = StringProperty('down')
task_name = StringProperty()
注意:除非您对TaskTemplate
有更多计划,否则无需扩展Button
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.