我注意到我在网上发布的大多数示例都没有外部.kv
文件。它们在内部定义所有实例。但是他们也说拥有外部.kv
文件是一种很好的做法。哪个更好?如果外部.kv
文件更好,那么我应该如何使用使用内部代码的代码并将其转换为外部.kv
文件?
例如,执行此操作 - >
from kivy.app import App
from kivy.uix.scatter import Scatter
from kivy.uix.label import Label
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.textinput import TextInput
from kivy.uix.boxlayout import BoxLayout
class TutorialApp(App):
def build(self):
b = BoxLayout(orientation='vertical')
t = TextInput(font_size=150,
size_hint_y=None,
height=200,
text='default')
f = FloatLayout()
s = Scatter()
l = Label(text='default',
font_size=150)
t.bind(text=l.setter('text'))
f.add_widget(s)
s.add_widget(l)
b.add_widget(t)
b.add_widget(f)
return b
if __name__ == "__main__":
TutorialApp().run()
而不是 -
<ScatterTextWidget>:
orientation: 'vertical'
TextInput:
id: my_textinput
font_size: 150
size_hint_y: None
height: 200
text: 'default'
FloatLayout:
Scatter:
Label:
text: my_textinput.text
font_size: 150
答案 0 :(得分:1)
&#34;内部&#34; kv的用法是通过Builder
类,它允许你甚至加载外部文件。这些示例以Builder.load_string(...)
方式表达,因为在一个文件中的一个位置放置一个小示例会更简单。
如何将其转换为外部?简单,将Builder.load_string()
中的字符串复制并粘贴到一个单独的.kv
文件中,该文件具有从App继承的类的名称(您的主要类build()
)并且该字符串是。它会从外部文件加载相同的东西。
为什么它变得更好还是更糟?实际上并不是这样的。这就像比较&#34; java&#34;和python风格,即要么把所有东西都放在你的文件中,基本上这个结构是一个&#39; la java,其中主文件包含:
class This(something):
SpecialClass.doThis()
AnotherClass.doThat()
和其他类(或不同的东西)在不同的文件中。或者这个结构:
class Special(...):
...
class Another(...):
...
class This(something):
Special.do_this()
Another.do_that()
它们都很有用,你会发现自己在混合它们之间。它是关于代码的透明度和清晰度的,但也许你不想拥有数百个文件......或者2MB main.py
,这几乎是对你如何决定编码的妥协
修改强>
python vs kv是一个有趣的&#34;战斗&#34;,但除了for
(和while
?)循环之外,你几乎可以用这么简单的方式在kv中做所有必要的事情! Kv在这里使写作更容易,例如删除太多像add_widget()
这样的东西,或者基本上只是为了重命名一个小部件或改变它的大小来在一个地方使用它。
在没有kv的500line文件中使用python你不会像在kv中使用100个额外行那么多。文档在python中有重要的部分,甚至可能针对那些不能/不想使用kv的用户。此例和所有示例都高度依赖于示例的作者和文档的特定部分。
这使我回到我之前提到的java vs python编码风格。做复杂的东西是没有意义的,只是因为你认为如果你能做得更清洁,更可读,感觉/看起来更好,也就是说,不要只是去一个方式你有一个工具,可以指数级地提高编码速度。找到中途。