我正在尝试使用Kivy python框架开发一个Android应用程序。目前我正在Windows上进行测试,当前的代码(希望很快能够扫描条形码和东西)正在制造一个错误,它只是四处乱转,从不给出像TypeError或类似的原因。
循环错误:
Traceback (most recent call last):
File "C:\Program Files (x86)\Python36-32\lib\site-packages\kivy\lang\builder.py", line 601, in _apply_rule
setattr(widget_set, key, value)
File "kivy\weakproxy.pyx", line 33, in kivy.weakproxy.WeakProxy.__setattr__ (kivy\weakproxy.c:1471)
File "kivy\properties.pyx", line 478, in kivy.properties.Property.__set__ (kivy\properties.c:5572)
File "kivy\properties.pyx", line 1342, in kivy.properties.ReferenceListProperty.set (kivy\properties.c:21169)
File "kivy\properties.pyx", line 494, in kivy.properties.Property.set (kivy\properties.c:6520)
File "kivy\properties.pyx", line 516, in kivy.properties.Property.set (kivy\properties.c:6405)
File "kivy\properties.pyx", line 571, in kivy.properties.Property.dispatch (kivy\properties.c:7105)
File "kivy\_event.pyx", line 1225, in kivy._event.EventObservers.dispatch (kivy\_event.c:14035)
File "kivy\_event.pyx", line 1107, in kivy._event.EventObservers._dispatch (kivy\_event.c:12788)
File "C:\Program Files (x86)\Python36-32\lib\site-packages\kivy\lang\builder.py", line 76, in call_fn
setattr(element, key, e_value)
File "kivy\weakproxy.pyx", line 33, in kivy.weakproxy.WeakProxy.__setattr__ (kivy\weakproxy.c:1471)
File "kivy\properties.pyx", line 478, in kivy.properties.Property.__set__ (kivy\properties.c:5572)
File "kivy\properties.pyx", line 1342, in kivy.properties.ReferenceListProperty.set (kivy\properties.c:21169)
File "kivy\properties.pyx", line 494, in kivy.properties.Property.set (kivy\properties.c:6520)
File "kivy\properties.pyx", line 516, in kivy.properties.Property.set (kivy\properties.c:6405)
File "kivy\properties.pyx", line 571, in kivy.properties.Property.dispatch (kivy\properties.c:7105)
File "kivy\_event.pyx", line 1225, in kivy._event.EventObservers.dispatch (kivy\_event.c:14035)
File "kivy\_event.pyx", line 1107, in kivy._event.EventObservers._dispatch (kivy\_event.c:12788)
File "C:\Program Files (x86)\Python36-32\lib\site-packages\kivy\lang\builder.py", line 76, in call_fn
setattr(element, key, e_value)
等
这是我目前的代码:
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ListProperty
from kivy.uix.screenmanager import ScreenManager, Screen
Builder.load_string("""
<ResultsScreen>:
id: rw
percentage: 50
FloatLayout:
canvas:
Color:
rgb: 1, 1, 1
Rectangle:
pos: self.pos
size: self.size
Color:
rgb: 0, 0, 0
Line:
circle: self.width * 0.5, self.height * 0.75, self.width * 0.40, 0, 360 * (rw.percentage / 100)
width: 15
cap: 'square'
joint: 'round'
Label:
id: percentage_label
text: '[color=#000000]' + str(rw.pecentage) + '%[/color]'
markup: True
pos_hint: {'center_x': 0.5, 'center_y': 0.75}
size_hint: 0.1, 0.1
halign: 'center'
valign: 'center'
Button:
text: 'Scan Again'
on_press: root.manager.current = 'camerascan'
size: self.width * 0.4, self.height * 0.05
pos_hint: {'center_x': 0.5, 'center_y': 0.1}
<CameraScreen>:
BoxLayout:
Button:
text: 'Cancel'
on_press: root.manager.current = 'results'
""")
class ResultsScreen(Screen):
pass
class CameraScreen(Screen):
pass
sm = ScreenManager()
sm.add_widget(CameraScreen(name='camerascan'))
sm.add_widget(ResultsScreen(name='results'))
class SweetTruthApp(App):
def build(self):
return sm
if __name__ == '__main__':
SweetTruthApp().run()
我不知道问题是什么或可能是什么,我对Kivy以及一般的python类的想法都不是很了解所以对此有所帮助。
答案 0 :(得分:2)
您实际上遇到了递归问题(因此错误循环)。在我告诉你问题是什么之前,我想告诉你我是如何自己发现的(我会给你一根钓竿而不是给你钓鱼)。
方法很简单,你可以自己轻松完成,并给我们一个关于问题所在的大提示。这就是诀窍:你刚开始删除.kv语言字符串中的代码。它主要影响设计,因此程序运行良好,没有一大块代码。我删除了CameraScreen
按钮 - 同样的错误。没有ResultsScreen
画布,标签 - 仍然是相同的错误。没有ResultsScreen
按钮 - 一个不同的错误。你拼写错误&#34;百分比&#34; as&#34; pecentage&#34;在第29行。纠正它 - 程序运行正常。使用相同的方法,您可能已经发现错误在第39行:size: self.width * 0.4, self.height * 0.05
。为什么这里有错误?现在这是我们可以开始的真正问题,下次你的作业也是如此(不要劝阻你 - 到目前为止应用看起来很有希望!)
想想你在这里做了什么:self.size = self.width * x, self.height * y
。来自kivy Widget docs:
size是(width,height)属性的ReferenceListProperty。
这基本上意味着当您更新size
属性时,属性width
和height
也会更新。反之亦然。所以你要说:&#34;用以前尺寸的优势更新尺寸&#34;而kivy去了#哦;这个小部件有一个新的尺寸,更好的更新宽度和高度&#34;然后去吧,哦,这个小部件有一个新的高度和宽度,更好地更新它的大小&#34;在一个无限循环中,然后继续。
我希望这不会让你感到困惑,如果是的话,这里有一个很好的video来解释属性如何在kivy中运作。
如果您的回答并不明显:将第39行更改为size: self.parent.width * 0.4, self.parent.height * 0.05
或size: root.width * 0.4, root.height * 0.05
,具体取决于您要执行的操作。并且不要忘记将size_hint: None, None
添加到该按钮,因为如果有width
或height
,则size_hint_x
和size_hint_y
会被忽略。
以下是现在的样子: SweetTruth fixed pic