Как нарисовать линию в каждом виджете в 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

Здесь я попытался создать класс 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)
  • main.py:
class Label111(Label):
    pass

Я думал, что при использовании self. я получу тестовую строку внутри каждой метки (всего 31), но у меня есть только 2 строки внизу окна. Вопрос: Как нарисовать две линии внутри каждой метки относительно ее центра?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
2 707
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку вы рисуете линии для 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

Другие вопросы по теме