当根窗口小部件来自.kv文件的实例时,出现Kivy错误

时间:2019-02-10 13:39:58

标签: kivy kivy-language

我有一个简单的代码,可以很好地工作,当我将.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会出现关于在第一种情况下显然可以正常工作的属性的错误(因此,没有错误)。

我想知道为什么会发生这种情况,当然还要知道如何解决(只有没有原因的修正会导致我/我们再次陷入同一错误中。)

1 个答案:

答案 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小部件。例如,kvtheRoot = Builder.load_file('somefile.kv')

如果您的应用没有return theRoot方法(或build()方法返回build()),则来自适当命名的None文件的根窗口小部件将被编码为应用kv小部件。