如何在 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 个文件以供您测试。
main.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 语言导入中使用别名?的主要内容,如果未能解决你的问题,请参考以下文章
如何编译 java 文件并使用 pyjnius 和 kivy 导入它们