Я пытаюсь показать бинарное дерево на метках. Как нарисовать линии внутри каждой метки от центра к правому и левому краям? Задача очень странная, я понимаю, но вам нужно отобразить самописное дерево с самыми основными объектами 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
Здесь я попытался создать класс 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. создаст собственную уникальную линию для каждой метки и отобразит ее относительно начала координат или центра метки.
#: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)
class Label111(Label):
pass
Я думал, что при использовании self. я получу тестовую строку внутри каждой метки (всего 31), но у меня есть только 2 строки внизу окна. Вопрос: Как нарисовать две линии внутри каждой метки относительно ее центра?
Поскольку вы рисуете линии для Label01
в его методе __init__()
, все линии рисуются до того, как будут установлены положение и размер 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