如何在 Kivy 语言导入中使用别名?

Posted

技术标签:

【中文标题】如何在 Kivy 语言导入中使用别名?【英文标题】:How to use alias name in a Kivy Language import? 【发布时间】:2013-06-20 22:00:12 【问题描述】:

在导入 Kivy 语言中的类时,我无法分配别名。我关注的文档是here:

从 python 导入一些东西:

#:import name x.y.z

相当于:

from x.y import z as name

我创建了问题的简化版本。 pieces.py 位于包装件内(及其各自的 __init__.py),pieces.kv 位于我的工作文件夹中。

pieces/pieces.py

from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout

class PieceA(Button):
    pass
class PieceB(Button):
    pass
class PieceC(GridLayout):
    pass

pieces.kv

#:import Boo pieces.pieces.PieceA
#:import Foo pieces.pieces.PieceB
#:import Too pieces.pieces.PieceC
<Boo>:
    text: "A"
<Foo>:
    text: "B"
<Too>:
    rows: 2
    Boo:
    Foo:

导入如文档中所述,但别名 Boo、Foo 和 Too 不是 被认可。如果我使用类的原始名称而不是别名,还有许多其他版本会出乎意料地起作用:

#:import Boo pieces.pieces
<PieceA>:
    text: "A"
<PieceB>:
    text: "B"
<PieceC>:
    rows: 2
    PieceA:
    PieceB:

即使我用#:import Boo pieces.pieces 代替#:import Boo pieces.pieces.PieceA。只要我使用类的原始名称,它就会继续工作,但我不能使用别名。 在导入 Kivy 语言的课程时如何使用别名?


我还在这里添加了我的其他 2 个文件以供您测试。

ma​​in.py

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.gridlayout import GridLayout

Builder.load_file('pieces.kv')

class Gallery(GridLayout):
    pass

class GalleryApp(App):
    def build(self):
        return Gallery()

GalleryApp().run()

gallery.kv

<Gallery>:
    cols: 3
    PieceA:
    PieceB:
    PieceC:

【问题讨论】:

指定我使用的是 Kivy v1.7.0 可能很重要,以防这是一个错误。 【参考方案1】:

我不确定你想要做什么实际上是可能的,但至少这个导入语法没有那个目的并且行为正确。也就是说,#:import 语法仅适用于 kv 文件的 python 部分,因此例如您可以包含类似的代码

#:import Boo pieces.pieces.PieceA
...
...
<SomeWidget>:
    Button:
        on_press: some_other_widget.add_widget(Boo())

这会如你所愿,Boo 是 PieceA 的标准 python 别名。

但是,当解析 kv 文件时,我不知道如何为类规则的名称取别名。我也不确定你为什么想要或需要(不是这意味着没有理由!),为什么不直接将它们称为 PieceA、PieceB 等?

【讨论】:

这是其他文件的一部分,我有一个类名冲突。我花了一段时间才弄清楚发生了什么,所以我结束了更改其中一个类的名称,因为导入不起作用。我明白你的观点,别名只适用于 python 端,但我不同意 #:import 语法只适用于 Python 端。如果我不输入,那么它就不能正常工作。 回复:你的最后一句话,这似乎很奇怪,我不使用任何导入并且规则应用得很好 - 我认为导入不应该是定义规则所必需的,仅用于 python代码。 github.com/inclement/fourierdroid 是我正在玩的一个项目,效果很好,但在 kv 文件中没有使用 #:import 好吧,没有导入就不行。你可以用我的例子来测试一下。 在 Fourierdroid 中,您正在使用一个 Kivy(fourier.kv) 文件,该文件因应用程序的名称为 FourierApp 而被调用。因此,不需要进口。不过,这给了我一个想法。我可以在 Python 文件的导入中分配别名,并使用 Kivy Builder 调用我的 pieces.kv

以上是关于如何在 Kivy 语言导入中使用别名?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 python 语言在 kivy 中定位图像?

如何在kivy中正确导入自定义小部件

如何使用 KV 语言在 Kivy 中制作自定义按钮?

如何编译 java 文件并使用 pyjnius 和 kivy 导入它们

如何将纯 python 中动态创建的按钮添加到用 Kivy 语言编写的 kivy 布局中?

在 KV 语言中使用 Kivy Garden Graph