【问题标题】:Arising errors in Kivy when root widget comes from an instance from .kv file当根小部件来自 .kv 文件中的实例时,Kivy 中出现错误
【发布时间】:2019-02-11 10:19:45
【问题描述】:

我有一个运行良好的简单代码,当我将 .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 会出现关于在第一种情况下显然有效的属性的错误(因此,没有错误)。

我想知道为什么会发生这种情况,当然还有如何解决它(只有没有原因的解决方法才会导致我/我们再次陷入同样的​​错误)。

【问题讨论】:

    标签: kivy kivy-language


    【解决方案1】:

    kv 文件的两个版本之间的区别在于 &lt;MoneyControl@Widget&gt;: 是如何创建 MoneyControl 小部件的规则。虽然MoneyControl: 实际上创建了一个MoneyControl 小部件(您的代码会忽略它)。您需要将MoneyControl: 更改为&lt;MoneyControl&gt;:,以便比较规则。然后他们都工作了。

    文档有点难以理解,但这里有一些要点:

    kv 文件中,&lt;&gt; 表示一个规则。所以&lt;MoneyControl&gt;: 是一个规则,在python 代码中任何MoneyControl() 都将遵循该规则(包括在build() 方法中)。

    kv 文件中的MoneyControl: 是构建MoneyControl 小部件的一个实例的指令。它不是rule。如果它不是任何其他规则或小部件的子小部件,则它只是一个根小部件。

    在python代码中(包括build()方法内部),MoneyControl()会创建一个MoneyControl的实例。如果kv 包含rule 用于MoneyControl,则在创建实例时将遵循该规则。如果没有rule,则创建MoneyControl 的新实例,而不考虑kv 文件。

    在您的App 中,如果您有一个build() 方法,那么无论该方法返回什么都是您的应用程序root 小部件。您可以在该方法中调用MoneyControl(),如果在加载的kv 中有rule 对应它,那么将遵循rule。或者,如果您从加载kv 文件(或字符串)中捕获了返回的root 小部件,则可以从kv 文件中返回root 小部件。例如,theRoot = Builder.load_file('somefile.kv')return theRoot

    如果您的应用没有build() 方法(或build() 方法返回None),则适当命名的kv 文件中的根小部件将编码您的应用root 小部件。

    【讨论】:

    • 但是,MoneyControl: 不会是根小部件(充当根的实例)。代码怎么能忽略它?在这里阅读:kivy.org/doc/stable/guide/lang.html 在“规则上下文”部分。那么,让我们在 .kv 文件中定义的“根小部件”不带 符号是不正确的吗?正确的一点是,为什么它不起作用的答案是因为它被忽略了......那么,我们应该使用工厂或构建器类来让它恢复工作,在没有 符号的情况下,如文档中所说的那样?还是我完全误解了文档?...
    • 在我上面的回答中查看更多信息。
    • 我明白了,当我在文档中阅读时,事情的运作方式与我最初的想法不同。我需要多次阅读才能理解所有内容,因为在文档中提到了“规则”,但没有关于什么是规则本身的定义。但现在更清楚了,毫无疑问,感谢分享知识!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    相关资源
    最近更新 更多