問題描述
我是 python 和 Kivy 編程的新手,所以遇到了麻煩,可能會在這里提出簡單的問題,但現在對我來說是一個很大的障礙.我正在用 kivy 開發一個 GUI.我有一些 TextInputs 可以獲取數值.在所有文本輸入之后,我有一個確定"按鈕,它可以獲取所有值并處理它們.我從 .kv 文件中的同一類調用函數時出錯.
main.py 文件:
# 文件名:jwelkreator.py進口獼猴桃kivy.require('1.7.0')從 kivy.app 導入應用程序從 kivy.lang 導入生成器從 kivy.uix.anchorlayout 導入 AnchorLayoutBuilder.load_file('simpleForm.kv')......JwelKreator 類(AnchorLayout):經過JwelKreatorApp 類(應用程序):定義構建(自我):返回 JwelKreator()如果 __name__=="__main__":JwelKreatorApp().run()
主kv文件
# 文件名:jwelkreator.kv#:kivy 1.7.0<JwelKreator>:錨點布局:anchor_x: '左'anchor_y:'頂部'我的布局:編號:_tool_boxsize_hint:無,0.75寬度:300......
simpleForm.py 用于文本輸入.
進口kivy從 kivy.app 導入應用程序從 kivy.lang 導入生成器從 kivy.config 導入配置從 kivy.uix.boxlayout 導入 BoxLayout類 LblTxt(BoxLayout):經過類 MyLayout(BoxLayout):def print_something(self):打印你好"
simpleForm.kv 文本輸入布局
<LblTxt@BoxLayout>:id:LblTxtid方向:水平"lblTxtIn: '默認'theTxt: iAmTxt標簽:文本:root.lblTxtIn大小提示:1,0.5文本輸入:編號:iAmTxt多行:假提示文本:僅限數字"輸入過濾器:'int'size_hint:0.5,無身高:30<MyLayout@BoxLayout>:方向:垂直"LblTxt:編號:lt0lblTxtIn: '基礎層'LblTxt:編號:lt1lblTxtIn: '基本曝光時間(毫秒)'LblTxt:編號:lt2lblTxtIn: '最小支撐高度(mm)'LblTxt:編號:lt3lblTxtIn: '支持層'LblTxt:編號:lt4lblTxtIn: '支持曝光時間(毫秒)'LblTxt:編號:lt5lblTxtIn: '工作暴露時間(毫秒)'標簽:text:"層數"按鈕:文字:好的"size_hint:0.5,無身高:30on_release: root.print_something()
當我按下確定"按鈕時,屬性錯誤生成.
Traceback(最近一次調用最后一次):文件jwelkreator.py",第 21 行,在 <module>JwelKreatorApp().run()運行中的文件/usr/lib/python2.7/dist-packages/kivy/app.py",第 600 行運行觸摸應用程序()runTouchApp 中的文件/usr/lib/python2.7/dist-packages/kivy/base.py",第 454 行EventLoop.window.mainloop()文件/usr/lib/python2.7/dist-packages/kivy/core/window/window_pygame.py",第 325 行,在 mainloopself._mainloop()_mainloop 中的文件/usr/lib/python2.7/dist-packages/kivy/core/window/window_pygame.py",第 231 行EventLoop.idle()文件/usr/lib/python2.7/dist-packages/kivy/base.py",第 297 行,處于空閑狀態self.dispatch_input()文件/usr/lib/python2.7/dist-packages/kivy/base.py",第 284 行,在 dispatch_inputpost_dispatch_input(*pop(0))post_dispatch_input 中的文件/usr/lib/python2.7/dist-packages/kivy/base.py",第 253 行wid.dispatch('on_touch_up', 我)文件_event.pyx",第 285 行,在 kivy._event.EventDispatcher.dispatch (kivy/_event.c:4184)文件/usr/lib/python2.7/dist-packages/kivy/uix/button.py",第 140 行,在 on_touch_upself.dispatch('on_release')文件_event.pyx",第 281 行,在 kivy._event.EventDispatcher.dispatch (kivy/_event.c:4134)文件simpleForm.kv",第 1 行,在 <module><LblTxt@BoxLayout>:AttributeError:MyLayout"對象沒有屬性print_something"
我被困在這里,沒有辦法解決它.有什么我想念的嗎?
@eyllanesc:根據你的建議,我已經從我的 kv 類名中刪除了 @BoxLayout.當我從 main.kv 調用 MyLayout 時,我的主 .kv 文件出現錯誤
我的布局:編號:_tool_boxsize_hint:無,0.75寬度:300
錯誤:
Traceback(最近一次調用最后一次):文件jwelkreator.py",第 21 行,在 <module>JwelKreatorApp().run()運行中的文件/usr/lib/python2.7/dist-packages/kivy/app.py",第 577 行根 = self.build()文件jwelkreator.py",第 18 行,在構建中返回 JwelKreator()文件/usr/lib/python2.7/dist-packages/kivy/uix/anchorlayout.py",第 62 行,在 __init__super(AnchorLayout, self).__init__(**kwargs)文件/usr/lib/python2.7/dist-packages/kivy/uix/layout.py",第 61 行,在 __init__超級(布局,自我).__init__(**kwargs)文件/usr/lib/python2.7/dist-packages/kivy/uix/widget.py",第 163 行,在 __init__Builder.apply(self)文件/usr/lib/python2.7/dist-packages/kivy/lang.py",第 1429 行,在應用中self._apply_rule(小部件,規則,規則)_apply_rule 中的文件/usr/lib/python2.7/dist-packages/kivy/lang.py",第 1534 行self._apply_rule(child, crule, rootrule)_apply_rule 中的文件/usr/lib/python2.7/dist-packages/kivy/lang.py",第 1496 行cls = Factory_get(cname)文件/usr/lib/python2.7/dist-packages/kivy/factory.py",第 91 行,在 __getattr__raise FactoryException('未知類 <%s>' % name)kivy.factory.FactoryException:未知類<MyLayout>
問題
您收到 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 文件.
I'm new to python and Kivy programming so getting trouble and may be asking simple question here, but its a big hurdle for me now. I am developing a GUI with kivy. I have some TextInputs which get numeric value. after all text inputs , I have a 'OK' button which gets all value and process them. I'm getting error in calling the function from same class in .kv file.
main.py file:
# 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()
main kv file
# 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 for text inputs.
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 TextInput Layout
<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()
While I press 'OK' button, attribute Error Generated.
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'
I am stuck here and not getting way to solve it. Is there anything I'm missing?
EDIT: @eyllanesc: as per your suggestion, I've removed @BoxLayout from my kv class name. I'm getting error from my main .kv file as I'm calling MyLayout from main.kv
MyLayout:
id: _tool_box
size_hint: None,0.75
width: 300
ERROR:
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>
Problem
You are getting AttributeError: 'MyLayout' object has no attribute 'print_something' because it cannot find the function, print_something.
Solution
Please refer to the explanations, example and output for details.
Explanations
jwelkreator.py
- Add from simpleForm import MyLayout
- Remove Builder.load_file('simpleForm.kv')
jwelkreator.kv
Add #:include simpleForm.kv to include an external kivy file.
include <file> - Kivy Language
Includes an external kivy file. This allows you to split complex widgets into their own files.
simpleForm.py
You don't have to define the dynamic class, LblTxt(BoxLayout) since you have it defined in your kv file.
Dynamic Classes - Programming Guide ? Kv language
This class, created just by the declaration of this rule, inherits from the Button class and allows us to change default values and create bindings for all its instances without adding any new code on the Python side.
simpleform.kv
Since in the Python script, simpleForm.py, you have already defined class MyLayout is of BoxLayout, you don't to inherit it in the kv file. Replace <MyLayout@BoxLayout> with <MyLayout>
Example
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()
Output
這篇關于Kivy'對象沒有屬性'錯誤的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!