【问题标题】:Kivy custom widget behaviourKivy 自定义小部件行为
【发布时间】:2021-07-27 04:33:21
【问题描述】:

我是编程新手,我想和 Kivy 一起玩来学习。我遇到了一些奇怪的事情,所以创建了这个小例子来演示。

在我的 text.kv 文件中,我有这个:

#:kivy 2.0.0

<smallLabel@Label>:
    font_size: 40

<bigLabel@Label>:
    font_size: 60

BoxLayout:
    orientation:'vertical'
    padding: 20
    spacing: 5
    
    smallLabel:
        text: 'Stays the same'

    bigLabel:
        id: changes
        text: 'changes'

在我的 python 文件中:

from kivy.app import App


class TestApp(App):
    pass

if __name__ == "__main__":
    TestApp().run()

当我运行它时,我得到了这个:

File "/home/marty/Python/datatut/test.kv", line 15
     text: 'Stays the same'
         ^
 SyntaxError: invalid syntax

现在,如果我更改小部件的大小写,使第一个字母为大写,则它可以工作:

<SmallLabel@Label>:
    font_size: 40

<bigLabel@Label>:
    font_size: 60

BoxLayout:
    orientation:'vertical'
    padding: 20
    spacing: 5
    
    SmallLabel:
        text: 'Stays the same'

    bigLabel:
        id: changes
        text: 'changes'

请注意,我只更改了 SmallLabel。我将 bigLable 保留为小写。 如果我反过来这样做,那就是留下 smallLabel 但制作 BigLabel 它失败并出现相同的错误。 为什么我需要大写我的小部件的名称,为什么只使用第一个? 我确实注意到在所有示例中,我看到第一个字母总是为自定义小部件名称大写,但没有看到这是一个要求,如果是,那么如果第一个小部件为什么第二个小部件工作是大写的吗?

【问题讨论】:

    标签: python python-3.x kivy kivy-language


    【解决方案1】:

    KV 语言加载器需要能够区分小部件和子小部件的属性,并且正如您所见,这两种类型都只是以: 结尾的一行文本,但有一个技巧,通过假设你的类遵循 PEP8 大写类和snake_case 属性的约定,它能够正确猜测。

    https://kivy.org/doc/stable/guide/lang.html#instantiate-children 指出了这一点(我有点同意)

    注意

    小部件名称应以大写字母开头,而属性名称 应该以小写字母开头。按照PEP8命名 鼓励约定。

    我假设第二个不需要这个猜测,因为它在第一个块之后没有缩进,所以它不能是父类的属性(属性必须在子声明之前),所以它只能是子小部件,在这种情况下不需要此规则,但我无法从 quick glance at the code 中找到这是如何发生的@

    【讨论】:

    • 感谢您的澄清。现在说得通了。
    猜你喜欢
    • 2014-05-12
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 2014-06-24
    • 1970-01-01
    相关资源
    最近更新 更多