我试着理解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:
但没有奏效。如果可以重复,那么如何将信息传递给块中的每个小部件?
答案 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]