我有一个简单的代码,可以很好地工作,当我将.kv文件中的根类更改为根实例时,它停止工作(某些工作已经开始工作了)。
.kv文件中已经有两行代码可以测试两种情况之间的差异,一种是评论,另一种是不评论。
我在Kivy论坛中问过,使用了没有结果的生成器类(因为我不知道有什么区别!)。作为Kivy的新手,我现在本能很少。
main.py:
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.properties import NumericProperty, ReferenceListProperty, ObjectProperty
from kivy.clock import Clock
from colorsys import hsv_to_rgb, rgb_to_hsv
from kivy.uix.gridlayout import GridLayout
class MoneyControl(Widget):
cartel = ObjectProperty(None)
lay = 3
rainbow = [0.0,1.0,1.0,1.0]
def hsva_to_rgba(self, hsva):
rgba = hsv_to_rgb(hsva[0], hsva[1], hsva[2])
rgba = list(rgba)
rgba.append(hsva[3])
return rgba
def update(self, dt):
self.lay += 1
self.cartel.text = str(self.lay)
self.rainbow[0] += self.lay*0.0001
finalRgba = self.hsva_to_rgba(self.rainbow)
self.cartel.color = finalRgba
class MoneyControlApp(App):
def build(self):
prog = MoneyControl()
Clock.schedule_interval(prog.update, 1.0 / 60.0)
return prog
if __name__ == '__main__':
MoneyControlApp().run()
kv文件:
#:kivy 1.0.9
<MoneyControl@Widget>: #This works. Comment this line...
#MoneyControl:#RootWidget instance (as appears in documentation) # ...uncomment this one. It stops working.
cartel: crt
Label:
id: crt
font_size: 20
center_x: root.width * 0.5
top: root.height * 0.5
text: "hola"
color: 1, .3, .8, 1
预期的结果将是在注释.kv文件的第一行并取消注释该示例继续起作用的第二行之后。
实际结果是,如果更改行,则kivy会出现关于在第一种情况下显然可以正常工作的属性的错误(因此,没有错误)。
我想知道为什么会发生这种情况,当然还要知道如何解决(只有没有原因的修正会导致我/我们再次陷入同一错误中。)
答案 0 :(得分:1)
您的kv
文件的两个版本之间的区别在于<MoneyControl@Widget>:
是如何创建MoneyControl
小部件的规则。尽管MoneyControl:
实际上创建了一个MoneyControl
小部件(您的代码将其忽略)。您需要将MoneyControl:
更改为<MoneyControl>:
,以便比较规则。然后它们都起作用。
文档有点难以理解,但是这里有一些要点:
在kv
文件中,<>
表示规则。因此<MoneyControl>:
是一条规则,在python代码中,任何MoneyControl()
都将遵循该规则(包括在build()
方法中)。
MoneyControl:
文件中的kv
是建立MoneyControl
小部件的一个实例的指令。它不是rule
。如果它不是其他任何规则或小部件的子级,则它只是一个根小部件。
在python代码中(包括build()
方法内部),MoneyControl()
将创建MoneyControl
的实例。如果kv
包含rule
的{{1}},则在创建实例时将遵循该规则。如果没有MoneyControl
,则将创建一个rule
的新实例,而不考虑MoneyControl
文件。
在您的kv
中,如果您有一个App
方法,那么该方法返回的就是您的应用build()
小部件。您可以使用该方法调用root
,如果已加载的MoneyControl()
中有rule
,则遵循kv
。或者,如果您通过加载rule
文件(或字符串)捕获了返回的root
小部件,则可以从kv
文件返回root
小部件。例如,kv
和theRoot = Builder.load_file('somefile.kv')
。
如果您的应用没有return theRoot
方法(或build()
方法返回build()
),则来自适当命名的None
文件的根窗口小部件将被编码为应用kv
小部件。