如何在kv文件中复制小部件块(仅限小写规则)

时间:2016-10-13 17:04:38

标签: class kivy kivy-language

我试着理解kivy .kv文件是如何工作的,所以我用一个包含三个GridLayout的水平BoxLayout创建了一个小应用程序,如图所示:

my_widget:

<my_widget@BoxLayout>:
    orientation: "horizontal"

    GridLayout:
        rows: 3
        ToggleButton:
        Image:
        Label:

    GridLayout:
        rows: 3
        ToggleButton:
        Image:
        Label:

    GridLayout:
        rows: 3
        ToggleButton:
        Image:
        Label:

没问题,但是因为有相同的小部件块(GridLayouts)可以复制吗?我尝试过类似:https://kivy.org/docs/api-kivy.lang.html

的内容
my_widget:

[my_widget2@GridLayout]:
    rows: 3
    ToggleButton:
    Image:
    Label:

<my_widget@BoxLayout>:
    orientation: "horizontal"

    my_widget2:
    my_widget2:
    my_widget2:

但没有奏效。如果可以重复,那么如何将信息传递给块中的每个小部件?

1 个答案:

答案 0 :(得分:1)

是的,每次遇到它时,这都会让我感到非常糟糕,例如将单词复制并粘贴到<>(并忘记大写)。我仍然想知道是否应将其视为错误或功能,因为它会强制用户以正确的样式/案例命名小部件,这样也便于阅读。

问题是kv语言中的小部件/规则应该使用ThisWordStyle或类似的东西,但第一个大写字母似乎是重要的。我甚至遇到过一个案例,当一个大写字母内的字母足够而其余的小写字母,但不能重现,可悲的是。

仅使用小写的单词主要用作属性或变量,因此my_widget可能作为属性或变量处理,就像global一样,或者在通过语言解析器运行时被完全忽略。

让我们看看:

1)你的kv布局放入App:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
Builder.load_string('''
<my_widget@BoxLayout>:
    my_widget2:
    Button:
        text: 'bla'

<MyWidget>:
    my_widget:
    Button:
        text: 'bad'

<my_widget2@GridLayout>:
    rows: 3
    ToggleButton:
    Image:
    Label:

''')
class MyWidget(BoxLayout):
    pass

class Test(App):
    def build(self):
        return MyWidget()
Test().run()

唯一可见的是Button 'bad'字符串

2)命名方面略有变化 - my_widget - &gt; My_widget

<My_widget@BoxLayout>:
    my_widget2:
    Button:
        text: 'bla'

<MyWidget>:
    My_widget:
    Button:
        text: 'bad'

<my_widget2@GridLayout>:
    rows: 3
    ToggleButton:
    Image:
    Label:

还有一个可见的小部件!

3)包含所有内容的工作布局(my_widget2 - &gt; My_widget2

<My_widget@BoxLayout>:
    My_widget2:
    My_widget2:
    Button:
        text: 'bla'

<MyWidget>:
    My_widget:
    Button:
        text: 'bad'

<My_widget2@GridLayout>:
    rows: 3
    ToggleButton:
    Image:
    Label:

同样要回答传递参数到这样的小部件(<My@Widget>),使用Factory访问这样的小部件,然后它只传递(kw)args:

#:import Factory kivy.factory.Factory
<MyWidget>:
    Button:
        on_release: root.add_widget(Factory.My_widget2(text='hi'))

<My_widget2@Label>:
    size_hint: [None, None]
    size: [200, 50]