我们如何在 kv 文件中使用循环创建多行? (Python3, 基维)
How can we create several lines using a loop in a kv file? (Python3, kivy)
我刚刚开始学习编码,正在探索 kivy。我想用 kivy 语言绘制一个网格。
画线的语法是:
<Frontend>:
canvas:
Line:
points: x_1, x_2, y_1, y_2
所以我决定继续使用与使用 Tkinter 相同的方法。
正如我所发现的,我们可以使用 kivy 语言迭代小部件。至少,它适用于标签。
#:import Label kivy.uix.label.Label
<Frontend>:
on_parent:
for i in range(3): self.add_widget(Label(text = 'Hello world'))
同时,当我尝试对线条做同样的事情时,它引发了不同的错误,这似乎是合乎逻辑的,因为我们在 kivy.graphics 中找到了线条,在 kivy.uix 中找到了其他小部件。
尽管如此,我已经尝试过(最后一次尝试):
#:import ins kivy.graphics.instructions
#:import v kivy.graphics.vertex_instructions
<Frontend>:
on_parent:
for i in range(3): ins.Canvas.add(v.Line(points=(x_1, x_1, x_2, x_2)))
我也尝试过“draw”,但两者都出现了同样的错误:“'kivy.graphics.instructions.Canvas' 对象的描述符 'add' 不适用于 'kivy.graphics.vertex_instructions.Line' 对象”。
所以用这种方式创建网格可能是不可能的?
美好的一天。我想到了一些您可以尝试的选项。
- 更正:您似乎有语法错误。如果您要添加新的小部件,则缩进。如果你正在执行一个函数(在这种情况下),你的代码与回调在同一行。此外,从 tenery 操作转向 lambda function.
<Frontend>:
on_parent: lambda *a: tuple(self.add_widget(Label(text='Hello world')) for i in range(3))
#Put it in line
- Factory:之前的代码可能行不通。添加 children 的 kivy 方法是使用
Factory
class.
#:import Factory kivy.factory.Factory
<Frontend>:
on_parent: lambda *a: tuple(self.add_widget(Factory.Label(text='Hello world')) for i in range(3))
- 遗憾的是,这些都行不通。最好的解决方案是创建一个 custom widget and define the logic within the widget in python. Use the builtin callbacks(for example).
class CustomLayout(GridLayout):
def on_parent(self, *args):
for i in range(3):
self.add_widget(Label(text="Hello world"))
你可以这样做:
#:import Line kivy.graphics.Line
<Frontend>:
pts: [100, 100, 500, 100, 100, 200, 500, 200, 100, 300, 500, 300]
canvas:
Color:
rgba: 1,1,1,1
on_parent:
for i in range(0, len(root.pts), 4): self.canvas.add(Line(points=root.pts[i:i+4]))
我刚刚开始学习编码,正在探索 kivy。我想用 kivy 语言绘制一个网格。 画线的语法是:
<Frontend>:
canvas:
Line:
points: x_1, x_2, y_1, y_2
所以我决定继续使用与使用 Tkinter 相同的方法。 正如我所发现的,我们可以使用 kivy 语言迭代小部件。至少,它适用于标签。
#:import Label kivy.uix.label.Label
<Frontend>:
on_parent:
for i in range(3): self.add_widget(Label(text = 'Hello world'))
同时,当我尝试对线条做同样的事情时,它引发了不同的错误,这似乎是合乎逻辑的,因为我们在 kivy.graphics 中找到了线条,在 kivy.uix 中找到了其他小部件。
尽管如此,我已经尝试过(最后一次尝试):
#:import ins kivy.graphics.instructions
#:import v kivy.graphics.vertex_instructions
<Frontend>:
on_parent:
for i in range(3): ins.Canvas.add(v.Line(points=(x_1, x_1, x_2, x_2)))
我也尝试过“draw”,但两者都出现了同样的错误:“'kivy.graphics.instructions.Canvas' 对象的描述符 'add' 不适用于 'kivy.graphics.vertex_instructions.Line' 对象”。
所以用这种方式创建网格可能是不可能的?
美好的一天。我想到了一些您可以尝试的选项。
- 更正:您似乎有语法错误。如果您要添加新的小部件,则缩进。如果你正在执行一个函数(在这种情况下),你的代码与回调在同一行。此外,从 tenery 操作转向 lambda function.
<Frontend>:
on_parent: lambda *a: tuple(self.add_widget(Label(text='Hello world')) for i in range(3))
#Put it in line
- Factory:之前的代码可能行不通。添加 children 的 kivy 方法是使用
Factory
class.
#:import Factory kivy.factory.Factory
<Frontend>:
on_parent: lambda *a: tuple(self.add_widget(Factory.Label(text='Hello world')) for i in range(3))
- 遗憾的是,这些都行不通。最好的解决方案是创建一个 custom widget and define the logic within the widget in python. Use the builtin callbacks(for example).
class CustomLayout(GridLayout):
def on_parent(self, *args):
for i in range(3):
self.add_widget(Label(text="Hello world"))
你可以这样做:
#:import Line kivy.graphics.Line
<Frontend>:
pts: [100, 100, 500, 100, 100, 200, 500, 200, 100, 300, 500, 300]
canvas:
Color:
rgba: 1,1,1,1
on_parent:
for i in range(0, len(root.pts), 4): self.canvas.add(Line(points=root.pts[i:i+4]))