如何在 Python Kivy 中的每个小部件中画线
How to draw line in each widget in Python Kivy
我正在尝试在标签上显示二叉树。如何在每个标签内从中心到左右边缘绘制线条?这个任务很奇怪,我明白了,但是你需要用最基本的 Kivy 对象展示一个自己写的树。不能使用紫藤树。网上所有的解决方案都是针对触摸屏的。
在这个循环中我添加了带有节点值的标签,如果没有找到节点则为 0
class TreeApp(App):
def build(self):
bl = BoxLayout(orientation='vertical', padding=5, spacing=5)
for i in range(maxdepth):
inside_bl = BoxLayout(orientation='horizontal')
for j in range(2 ** i):
try: inside_bl.add_widget(Label01(text=str(mx_lvl[i][j]),color=(0.5,0.5,0.5,1)))
except: inside_bl.add_widget(Label111(text="0",color=(0.5,0.5,0.5,0.5)))
bl.add_widget(inside_bl)
return bl
这里我尝试制作class label01。我想用自己。将为每个标签创建自己的线并相对于标签的原点或中心绘制。
class Label01(Label):
def __init__(self,**kwargs):
super(Label01,self).__init__(**kwargs)
with self.canvas:
self.pos = self.pos
Color(0,1,0,1)
self.line= Line(points=(self.x+100,self.y+100,self.x+250,self.y+250),close = True)
同样适用于标签 111。我想使用 self。将为每个标签创建自己独特的线条并相对于标签的原点或中心绘制。
- tree.kv
#:kivy 1.11.1
<Label111>:
canvas.before:
Line:
width: 2
points: (self.x, self.y+50, self.x+200, self.y+100, self.x+300, self.y+200)
Color:
rgb: (0.9,0.9,0.9,0.9)
- main.py:
class Label111(Label):
pass
我认为在使用 self.我将在每个标签内得到一条测试线(总共 31 条),但我在 window 的底部只有 2 条线。问题:如何在每个标签内相对于其中心绘制两条线?
因为您在其 __init__()
方法中为 Label01
绘制线条,所以在设置 Label01
的位置和大小之前绘制所有线条。所以所有的线都是使用 Label01
的默认位置绘制的,即 (0,0)。由于您是在 python 代码中执行此操作,因此当 Label01
的位置更改时,没有绑定来调整行。
这可以通过编写您自己的绑定来进行调整来解决,或者让 kv
通过定义 kv
中的行来为您完成。像这样:
<Label01>:
canvas.before:
Color:
rgba: 0,1,0,1
Line:
points: self.center_x,self.center_y,self.center_x+250,self.center_y+250
这些点是相对于 Label01
的中心定义的(如您所提到的),然后 Label01
的定义变得简单:
class Label01(Label):
pass
我正在尝试在标签上显示二叉树。如何在每个标签内从中心到左右边缘绘制线条?这个任务很奇怪,我明白了,但是你需要用最基本的 Kivy 对象展示一个自己写的树。不能使用紫藤树。网上所有的解决方案都是针对触摸屏的。
在这个循环中我添加了带有节点值的标签,如果没有找到节点则为 0
class TreeApp(App):
def build(self):
bl = BoxLayout(orientation='vertical', padding=5, spacing=5)
for i in range(maxdepth):
inside_bl = BoxLayout(orientation='horizontal')
for j in range(2 ** i):
try: inside_bl.add_widget(Label01(text=str(mx_lvl[i][j]),color=(0.5,0.5,0.5,1)))
except: inside_bl.add_widget(Label111(text="0",color=(0.5,0.5,0.5,0.5)))
bl.add_widget(inside_bl)
return bl
这里我尝试制作class label01。我想用自己。将为每个标签创建自己的线并相对于标签的原点或中心绘制。
class Label01(Label):
def __init__(self,**kwargs):
super(Label01,self).__init__(**kwargs)
with self.canvas:
self.pos = self.pos
Color(0,1,0,1)
self.line= Line(points=(self.x+100,self.y+100,self.x+250,self.y+250),close = True)
同样适用于标签 111。我想使用 self。将为每个标签创建自己独特的线条并相对于标签的原点或中心绘制。
- tree.kv
#:kivy 1.11.1
<Label111>:
canvas.before:
Line:
width: 2
points: (self.x, self.y+50, self.x+200, self.y+100, self.x+300, self.y+200)
Color:
rgb: (0.9,0.9,0.9,0.9)
- main.py:
class Label111(Label):
pass
我认为在使用 self.我将在每个标签内得到一条测试线(总共 31 条),但我在 window 的底部只有 2 条线。问题:如何在每个标签内相对于其中心绘制两条线?
因为您在其 __init__()
方法中为 Label01
绘制线条,所以在设置 Label01
的位置和大小之前绘制所有线条。所以所有的线都是使用 Label01
的默认位置绘制的,即 (0,0)。由于您是在 python 代码中执行此操作,因此当 Label01
的位置更改时,没有绑定来调整行。
这可以通过编写您自己的绑定来进行调整来解决,或者让 kv
通过定义 kv
中的行来为您完成。像这样:
<Label01>:
canvas.before:
Color:
rgba: 0,1,0,1
Line:
points: self.center_x,self.center_y,self.center_x+250,self.center_y+250
这些点是相对于 Label01
的中心定义的(如您所提到的),然后 Label01
的定义变得简单:
class Label01(Label):
pass