python - 使用外部 .kv 文件与内部处理?

标签 python kivy

我注意到我在网上找到的大多数示例都没有外部 .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

最佳答案

kv 的“内部”使用是通过 Builder类,它甚至允许您加载外部文件。这些示例以 Builder.load_string(...) 的方式措辞,因为在一个文件的某个位置放置一个小示例会更简单。

如何将其转换为外部的?简单,将 Builder.load_string() 中的字符串复制并粘贴到一个单独的 .kv 文件中,该文件具有继承自 App 的类的名称(带有 build 的主类) ()) 就是这样。它将从外部文件加载相同的内容。

为什么会更好或者更差?其实都不是这样的。这就像比较“java”和 python 风格,即要么将所有内容从文件中取出,然后基本上采用 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 与 kv 是一场有趣的“战斗”,但是除了 for(和 while?)循环之外,您几乎可以以如此简单的方式在 kv 中完成所有必要的事情! Kv 的存在是为了让写作变得更容易,例如删除太多像 add_widget() 这样的东西,或者基本上创建一个空类只是为了重命名小部件或更改其大小以便在一个地方使用它。

在没有 kv 的 500 行文件中使用 python,你不会像在 kv 中额外添加 100 行那样做那么多事情。该文档在 python 中有重要的部分,也许它甚至是针对不能/不想使用 kv 的用户。此外,这个示例和所有示例都高度依赖于示例的作者和文档的特定部分。

这让我回到了我之前提到的 java 与 python 编码风格。仅仅因为你认为如果你能做得更干净、更具可读性,它会感觉/看起来更好,就做复杂的事情是没有意义的,也就是说,如果你有一个可以提高速度的工具,就不要只走一种方式编码数量呈指数级增长。找到中间道路。

关于python - 使用外部 .kv 文件与内部处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38166665/

相关文章:

Python:SWIG:包装对结构的访问

python - 在Python程序中使用Linux环境变量

python Pandas 如果列表中的列中的单词在新列中添加 Y 标志

python - Coinbase API 标准 python 示例返回 "invalid signature"

python - 在 Kivy 应用程序中根据 bool 条件更改标签

python - 将 Python 代码转换为适用于 Android 的 apk?

python - Ubuntu Buildozer JAVA_HOME 设置为无效目录

php - 如何在 PHP/Python 中解析 WSDL?

python - 如何在 main.py 中捆绑 Kivy 代码

android - 如何在 Windows 上使用 Python for Android 将 .py 转换为 APK 文件?