Kivy'对象没有属性'错误
Posted
技术标签:
【中文标题】Kivy\'对象没有属性\'错误【英文标题】:Kivy 'object has no attribute' ErrorKivy'对象没有属性'错误 【发布时间】:2018-09-01 18:05:56 【问题描述】:我是 python 和 Kivy 编程的新手,所以遇到了麻烦,可能会在这里提出简单的问题,但现在对我来说是一个很大的障碍。 我正在用 kivy 开发一个 GUI。我有一些 TextInputs 可以获取数值。在所有文本输入之后,我有一个“确定”按钮,它可以获取所有值并处理它们。 我从 .kv 文件中的同一类调用函数时出错。
main.py 文件:
# File name: jwelkreator.py
import kivy
kivy.require('1.7.0')
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.anchorlayout import AnchorLayout
Builder.load_file('simpleForm.kv')
...
...
class JwelKreator(AnchorLayout):
pass
class JwelKreatorApp(App):
def build(self):
return JwelKreator()
if __name__=="__main__":
JwelKreatorApp().run()
主kv文件
# File name: jwelkreator.kv
#:kivy 1.7.0
<JwelKreator>:
AnchorLayout:
anchor_x: 'left'
anchor_y: 'top'
MyLayout:
id: _tool_box
size_hint: None,0.75
width: 300
...
...
simpleForm.py 用于文本输入。
import kivy
from kivy.app import App
from kivy.lang import Builder
from kivy.config import Config
from kivy.uix.boxlayout import BoxLayout
class LblTxt(BoxLayout):
pass
class MyLayout(BoxLayout):
def print_something(self):
print "Hello"
simpleForm.kv 文本输入布局
<LblTxt@BoxLayout>:
id:LblTxtid
orientation: 'horizontal'
lblTxtIn: 'default'
theTxt: iAmTxt
Label:
text: root.lblTxtIn
size_hint: 1,0.5
TextInput:
id: iAmTxt
multiline: False
hint_text: "numeric only"
input_filter: 'int'
size_hint: 0.5,None
height: 30
<MyLayout@BoxLayout>:
orientation: 'vertical'
LblTxt:
id: lt0
lblTxtIn: 'Base Layers'
LblTxt:
id: lt1
lblTxtIn: 'Base exposer time(ms)'
LblTxt:
id: lt2
lblTxtIn: 'Min Support Height(mm)'
LblTxt:
id: lt3
lblTxtIn: 'Support Layers'
LblTxt:
id: lt4
lblTxtIn: 'Support exposer time(ms)'
LblTxt:
id: lt5
lblTxtIn: 'Job exposer time(ms)'
Label:
text:"Number of Layers"
Button:
text: 'OK'
size_hint: 0.5,None
height: 30
on_release: root.print_something()
当我按下“确定”按钮时,属性错误生成。
Traceback (most recent call last):
File "jwelkreator.py", line 21, in <module>
JwelKreatorApp().run()
File "/usr/lib/python2.7/dist-packages/kivy/app.py", line 600, in run
runTouchApp()
File "/usr/lib/python2.7/dist-packages/kivy/base.py", line 454, in runTouchApp
EventLoop.window.mainloop()
File "/usr/lib/python2.7/dist-packages/kivy/core/window/window_pygame.py", line 325, in mainloop
self._mainloop()
File "/usr/lib/python2.7/dist-packages/kivy/core/window/window_pygame.py", line 231, in _mainloop
EventLoop.idle()
File "/usr/lib/python2.7/dist-packages/kivy/base.py", line 297, in idle
self.dispatch_input()
File "/usr/lib/python2.7/dist-packages/kivy/base.py", line 284, in dispatch_input
post_dispatch_input(*pop(0))
File "/usr/lib/python2.7/dist-packages/kivy/base.py", line 253, in post_dispatch_input
wid.dispatch('on_touch_up', me)
File "_event.pyx", line 285, in kivy._event.EventDispatcher.dispatch (kivy/_event.c:4184)
File "/usr/lib/python2.7/dist-packages/kivy/uix/button.py", line 140, in on_touch_up
self.dispatch('on_release')
File "_event.pyx", line 281, in kivy._event.EventDispatcher.dispatch (kivy/_event.c:4134)
File "simpleForm.kv", line 1, in <module>
<LblTxt@BoxLayout>:
AttributeError: 'MyLayout' object has no attribute 'print_something'
我被困在这里,没有办法解决它。有什么我想念的吗?
编辑: @eyllanesc:根据你的建议,我已经从我的 kv 类名中删除了 @BoxLayout。当我从 main.kv 调用 MyLayout 时,我的主 .kv 文件出现错误
MyLayout:
id: _tool_box
size_hint: None,0.75
width: 300
错误:
Traceback (most recent call last):
File "jwelkreator.py", line 21, in <module>
JwelKreatorApp().run()
File "/usr/lib/python2.7/dist-packages/kivy/app.py", line 577, in run
root = self.build()
File "jwelkreator.py", line 18, in build
return JwelKreator()
File "/usr/lib/python2.7/dist-packages/kivy/uix/anchorlayout.py", line 62, in __init__
super(AnchorLayout, self).__init__(**kwargs)
File "/usr/lib/python2.7/dist-packages/kivy/uix/layout.py", line 61, in __init__
super(Layout, self).__init__(**kwargs)
File "/usr/lib/python2.7/dist-packages/kivy/uix/widget.py", line 163, in __init__
Builder.apply(self)
File "/usr/lib/python2.7/dist-packages/kivy/lang.py", line 1429, in apply
self._apply_rule(widget, rule, rule)
File "/usr/lib/python2.7/dist-packages/kivy/lang.py", line 1534, in _apply_rule
self._apply_rule(child, crule, rootrule)
File "/usr/lib/python2.7/dist-packages/kivy/lang.py", line 1496, in _apply_rule
cls = Factory_get(cname)
File "/usr/lib/python2.7/dist-packages/kivy/factory.py", line 91, in __getattr__
raise FactoryException('Unknown class <%s>' % name)
kivy.factory.FactoryException: Unknown class <MyLayout>
【问题讨论】:
【参考方案1】:问题
您收到 AttributeError: 'MyLayout' object has no attribute 'print_something',因为它找不到函数 print_something。 p>
解决方案
详情请参阅解释、示例和输出。
说明
jwelkreator.py
-
添加 from simpleForm import MyLayout
删除 Builder.load_file('simpleForm.kv')
jwelkreator.kv
添加 #:include simpleForm.kv 以包含外部 kivy 文件。
include <file> - Kivy Language
包括一个外部 kivy 文件。这允许您将复杂的小部件拆分为它们自己的文件。
simpleForm.py
您不必定义动态类,LblTxt(BoxLayout),因为您已经在 kv 文件中定义了它。
Dynamic Classes - Programming Guide » Kv language
这个类是由这个规则的声明创建的,它继承自 Button 类,允许我们更改默认值并为其所有实例创建绑定,而无需在 Python 端添加任何新代码。
simpleform.kv
由于在Python脚本simpleForm.py中,你已经定义了类MyLayout是BoxLayout的,你不要在kv文件中继承它。将
示例
jwealkreator.py
>from kivy.app import App
from kivy.uix.anchorlayout import AnchorLayout
from simpleForm import MyLayout
class JwelKreator(AnchorLayout):
pass
class JwelKreatorApp(App):
def build(self):
return JwelKreator()
if __name__ == "__main__":
JwelKreatorApp().run()
jwealkreator.kv
# File name: jwelkreator.kv
#:kivy 1.10.0
#:include simpleform.kv
<JwelKreator>:
anchor_x: 'left'
anchor_y: 'top'
MyLayout:
id: _tool_box
size_hint: None,0.75
width: 300
simpleForm.py
>from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
class MyLayout(BoxLayout):
def print_something(self):
print("Hello")
class SimpleFormApp(App):
def build(self):
return MyLayout()
if __name__ == "__main__":
SimpleFormApp().run()
simpleform.kv
#:kivy 1.10.0
<LblTxt@BoxLayout>:
id:LblTxtid
orientation: 'horizontal'
lblTxtIn: 'default'
theTxt: iAmTxt
Label:
text: root.lblTxtIn
size_hint: 1,0.5
TextInput:
id: iAmTxt
multiline: False
hint_text: "numeric only"
input_filter: 'int'
size_hint: 0.5,None
height: 30
<MyLayout>:
orientation: 'vertical'
LblTxt:
id: lt0
lblTxtIn: 'Base Layers'
LblTxt:
id: lt1
lblTxtIn: 'Base exposer time(ms)'
LblTxt:
id: lt2
lblTxtIn: 'Min Support Height(mm)'
LblTxt:
id: lt3
lblTxtIn: 'Support Layers'
LblTxt:
id: lt4
lblTxtIn: 'Support exposer time(ms)'
LblTxt:
id: lt5
lblTxtIn: 'Job exposer time(ms)'
Label:
text:"Number of Layers"
Button:
text: 'OK'
size_hint: 0.5,None
height: 30
on_release: root.print_something()
输出
【讨论】:
非常感谢您的解释。它对我有用! #:include simpleform.kv 给了我无效的指令错误,但我已经在我的主 py 文件中使用 Builder 添加了 .kv,所以它可以工作。非常感谢。以上是关于Kivy'对象没有属性'错误的主要内容,如果未能解决你的问题,请参考以下文章
AttributeError:“kivy.properties.ObjectProperty”对象没有属性“manager1”