繁体   English   中英

Kivy:AttributeError:'...'对象没有属性'...',但它有

[英]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值的更改,那么您有两种选择。

  1. 编写 python 代码,当您更改update_state的值时,该代码将更新CheckBox
  2. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM