Как правильно импортировать пользовательские виджеты в киви - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть виджет (W2), сделанный из других виджетов (W1).У каждого есть соответствующий файл .kv, как показано ниже.Запустив main.py, я ожидаю увидеть черный фон с двумя метками, расположенными вертикально.Вместо этого я ставлю обе метки друг на друга, поэтому что-то пошло не так.

kivy.factory.FactoryException: Unknown class <W1>

Поэтому я подумал: «Может быть, мне следует импортировать w1.py в w2.py, хотя он явно не используется вфайл py? Это ... вроде работает. Я получаю обе метки друг над другом, как на следующем рисунке.

enter image description here

Чтоя делаю неправильно? Как правильно написать виджет, который, как ожидается, будет импортирован / включен другим виджетом? И как правильно импортировать его?

Я пытался использовать Builder.load_file() в .pyфайл и просто импортирует файл .py, но у которого были похожие результаты.

w1.py:

import kivy
from kivy.properties import StringProperty
from kivy.uix.widget import Widget
kivy.require('1.10.0')

class W1(Widget):
    text = StringProperty('default')

    def __init__(self,  **kwargs):
        super(W1, self).__init__(**kwargs)

w1.kv:

#:kivy 1.10.0

<W1>:
    text:
    Label:
        text: root.text

w2.py:

import kivy from kivy.uix.boxlayout import BoxLayout
# from w1 import W1  # added this to get a working, but the incorrect layout
kivy.require('1.10.0')

class W2(BoxLayout):

    def __init__(self,  **kwargs):
        super(W2, self).__init__(**kwargs)

w2.kv:

#:kivy 1.10.0
#:include w1.kv

<W2>:
    orientation: 'vertical'
    W1:
        text: 'w1.1' 
    W1:
        text: 'w1.2'

main.py:

import kivy
from w2 import W2
from kivy.app import App
kivy.require('1.10.0')


class mainApp(App):

    def build(self):
        pass


if __name__ == '__main__':
    mainApp().run()

main.kv:

#:kivy 1.10.0
#:include w2.kv

W2:

РЕДАКТИРОВАТЬ Перекрытие устранено, хотя, возможно, нетправильно. У меня было W1 наследовать от BoxLayout, а не Widget, с мысльючто, возможно, в базовом классе Widget отсутствовало свойство минимальной высоты / ширины.

Я до сих пор не уверен, что такое «правильный» способ обработки импорта виджета с парным файлом .kv, илиименно поэтому я получаю перекрывающиеся виджеты, когда я наследую от Widget;только домыслы.enter image description here

...