На самом деле ваше приложение по-прежнему работает правильно даже после добавления файла 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](https://i.stack.imgur.com/F0SX3.png)