如何复制 kv 文件中的小部件块(仅限小写规则)
How to duplicate blocks of widgets in kv file (lowercase-only rule)
我试图了解 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:
但没用。如果可以复制,那么 如何将信息传递给块中的每个小部件?
是的,每次遇到它都会让我很生气,例如将单词复制并粘贴到 <>
(忘记大写)。我仍然想知道我是否应该将其视为错误或功能,因为它强制用户以正确的方式命名小部件 style/case,这也使阅读更容易。
问题是widgets/rules在kv语言中应该使用ThisWordStyle或类似的东西,但是第一个大写字母似乎重要。我什至遇到过单词里面一个大写字母就够了,其余的小写,但无法重现,遗憾的是。
只有小写字母的单词大多用作属性或变量,因此可能 my_widget
被处理为 属性 或太像 global
的变量,或者在 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
-> 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
-> 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]
我试图了解 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:
但没用。如果可以复制,那么 如何将信息传递给块中的每个小部件?
是的,每次遇到它都会让我很生气,例如将单词复制并粘贴到 <>
(忘记大写)。我仍然想知道我是否应该将其视为错误或功能,因为它强制用户以正确的方式命名小部件 style/case,这也使阅读更容易。
问题是widgets/rules在kv语言中应该使用ThisWordStyle或类似的东西,但是第一个大写字母似乎重要。我什至遇到过单词里面一个大写字母就够了,其余的小写,但无法重现,遗憾的是。
只有小写字母的单词大多用作属性或变量,因此可能 my_widget
被处理为 属性 或太像 global
的变量,或者在 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
-> 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
-> 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]