我是python和Kivy编程新手,所以遇到麻烦,可能会问一些简单的问题,但现在对我来说这是一个很大的障碍。 我正在用kivy开发一个GUI。我有一些文本输入可以得到数值。在所有的文本输入之后,我有一个“确定”按钮,它获取所有值并处理它们。 从.kv文件中的同一类调用函数时出错。在
主.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()
主文件
^{pr2}$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.kvTextInput布局
<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'
我被困在这里,没有办法解决它。我有什么遗漏吗?在
编辑: @根据你的建议,我把@BoxLayout从我的kv类名中删除了。当我从调用MyLayout时,我的主.kv文件出错主电压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>
问题
您将得到AttributeError:“MyLayout”对象没有属性“print\u something”,因为它找不到函数,print\u something。在
解决方案
请参阅说明、示例和输出以了解详细信息。在
解释
在jwelkreator.py
在jwelkreator.kv
添加:包括simpleForm.kv包括一个外部kivy文件。在
include <file> - Kivy Language
在simpleForm.py
您不必定义动态类,LblTxt(BoxLayout),因为您已经在kv文件中定义了它。在
Dynamic Classes - Programming Guide » Kv language
在simpleform.kv
因为在Python脚本中,simpleForm.py,您已经定义了类MyLayout是BoxLayout,您不必在kv文件中继承它。更换<;MyLayout@box布局>;使用<;MyLayout>
示例
在jwealkerator.py在
在jwealkreator.kv在
^{pr2}$在simpleForm.py在
在simpleform.kv在
输出
相关问题 更多 >
编程相关推荐