Пользовательское свойство файла Kivy KV - PullRequest
0 голосов
/ 25 мая 2018

Не могу понять, как передать пользовательское свойство в пользовательский виджет через файл KV.Мое приложение представляет собой простую сетку, которая содержит Button () и TestWidget ().TestWidget () имеет функцию StringProperty () test_property, которая, похоже, не получает данные из файла KV, как это видно из оператора печати в init.Вот несколько простых кодов для примера.

Спасибо.

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.widget import Widget
from kivy.lang import Builder
from kivy.properties import StringProperty


Builder.load_string("""
<TestWidget>:

<TestGrid>:
    Button:
    TestWidget:
        test_property: 'Test Property'
""")


class TestWidget(Widget):
    test_property = StringProperty()

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

        print('Test OUTPUT:', self.test_property)


class TestGrid(GridLayout):
    pass


class MyApp(App):
    def build(self):
        return TestGrid()


MyApp().run()

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Попробуйте напечатать его на следующем кадре, а не при инициации объекта.
После создания объекта вы можете получить доступ к свойствам.
Это делается с помощью часов.Как это:

from kivy.clock import Clock    

class TestWidget(Widget):
    test_property = StringProperty()

    def __init__(self, **kwargs):
        super(TestWidget, self).__init__(**kwargs)
        Clock.schedule_once(self.after_init) # run method on next frame

    def after_init(self,dt):
        print('Test OUTPUT:', self.test_property)
0 голосов
/ 25 мая 2018

Думаю, я понял это.Киви ничего не передает объектам.Я узнал об этом в https://kivy.org/docs/api-kivy.properties.html.

Я использую on_, чтобы сделать то, что должно быть сделано.Существует большая разница между объектами Kivy и объектами Python.

Вот пример пользовательского BoxLayout;

class KivyInput(BoxLayout):
    text_test = StringProperty()

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

        self.orientation = 'horizontal'
        self.label = Label()
        self.text_input = TextInput(multiline=False)
        self.add_widget(self.label)
        self.add_widget(self.text_input)

    def on_text_test(self, instance, value):
        self.label.text = value

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