Kivy - как мне определить путь к виджету в файле .kv - PullRequest
1 голос
/ 13 марта 2019

в моем коде Python я смог нарисовать линию в виджете, определенном в файле .kv, используя self.canvas.before.

Затем, в .kv, я переместил виджет внутрь TabbedPanelItem, и он больше не работает правильно.

self.canvas.before не правильный путь, что я должен использовать вместо этого? Какой правильный путь?

В общем, как мне выяснить иерархию? Эти объекты в файле .kv создаются разработчиком (если я правильно понимаю), как мне выяснить, как связать код Python с объектом, созданным создателем. Спасибо за любую помощь.

main.py:

class SampBoxLayout(BoxLayout):
    def __init__(self, **kwargs):
        super(SampBoxLayout, self).__init__(**kwargs)
        with self.canvas.before:
            self.myline=Line(points=(100,100,400,500), close=False, width=2)

main.kv

SampBoxLayout:
<SampBoxLayout>:
    orientation: "vertical"
    padding: 0
    spacing: 0
    TabbedPanel:
        do_default_tab: False
        TabbedPanelItem:
            text: "noc_clk"
            BoxLayout:
                orientation: "vertical"
                Widget:
                    height: "440dp"
                    size_hint_y: None
                    canvas:
                        Color:
                            rgba: 0, 0, 0, 0.5
                TabbedPanel:
                    do_default_tab: False
                    TabbedPanelItem:
                        text: "Node0"
                        BoxLayout:
                            orientation: "horizontal"

1 Ответ

0 голосов
/ 14 марта 2019

На самом деле ваше приложение по-прежнему работает правильно даже после добавления файла kv. Линия рисуется на холсте SampBoxLayout, но ее не видно, потому что у каждого виджета непрозрачность 1,0, то есть непрозрачность. В приведенном ниже примере, чтобы показать нарисованную линию, я добавил opacity = 0.5 под TabbedPanel.

Иерархия / Путь

Kv language »Контекст правила

Существует три ключевых слова, специфичных для языка Kv:

приложение : всегда относится к экземпляру вашего приложения.

root : ссылается на базовый виджет / шаблон в текущем правиле

self : всегда ссылаться на текущий виджет

Выражения значений, выражения on_property, идентификаторы и зарезервированные ключевые слова

сам

Ключевое слово self ссылается на «текущий экземпляр виджета»:

Button:
    text: 'My state is %s' % self.state

корень

Это ключевое слово доступно только в определениях правил и представляет корневой виджет правила (первый экземпляр правила):

<MyWidget>:
    custom: 'Hello world'
    Button:
        text: root.custom

приложение

Это ключевое слово всегда относится к экземпляру вашего приложения. Это эквивалентно вызов kivy.app.App.get_running_app () в Python.

Label:
    text: app.name

Привязка кода Python к объекту, созданному в файле kv

Метод 1

  • Объявите ObjectProperty на уровне класса и подключите его к id объекта, созданного в файле kv. Это лучший метод практики.

main.py

from kivy.properties import ObjectProperty


class SampBoxLayout(BoxLayout):
    tp = ObjectProperty(None)

main.kv

<SampBoxLayout>:
    tp: tp
    orientation: "vertical"
    padding: 0
    spacing: 0

    TabbedPanel:
        id: tp
        opacity: 0.5

Метод 2

  • Добавление id к объекту, созданному в файле kv и с использованием self.ids.id-name или self.ids['id-name']

Лучшая практика и скорость

Примечание

Несмотря на то, что метод self.ids очень лаконичен, его обычно считают «наилучшей практикой» для использования ObjectProperty. Это создает прямая ссылка, обеспечивает более быстрый доступ и является более явным.

* +1107 * Пример

main.py

from kivy.base import runTouchApp
from kivy.uix.boxlayout import BoxLayout
from kivy.graphics import Line
from kivy.lang import Builder


class SampBoxLayout(BoxLayout):
    def __init__(self, **kwargs):
        super(SampBoxLayout, self).__init__(**kwargs)
        with self.canvas.before:
            self.myline=Line(points=(100, 100, 400, 500), close=False, width=2)


if __name__ == "__main__":
    runTouchApp(Builder.load_file('main.kv'))

main.kv

SampBoxLayout:
<SampBoxLayout>:
    orientation: "vertical"
    padding: 0
    spacing: 0

    TabbedPanel:
        opacity: 0.5
        do_default_tab: False

        TabbedPanelItem:
            text: "noc_clk"
            BoxLayout:
                orientation: "vertical"
                Widget:
                    height: "440dp"
                    size_hint_y: None
                    canvas:
                        Color:
                            rgba: 0, 0, 0, 0.5
                TabbedPanel:
                    do_default_tab: False
                    TabbedPanelItem:
                        text: "Node0"
                        BoxLayout:
                            orientation: "horizontal"

выход

Line Drawn

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...