Как передать методы и свойства StringProperties через виджет Kivy в kv lang - PullRequest
0 голосов
/ 18 апреля 2019

Я создаю некоторые виджеты в kivy для их повторного использования. Как я могу передать методы и свойства для инициализации нового виджета? Я получаю переменную передачи строк и работает хорошо, но что происходит с методами и свойствами?

Это виджет, который я хочу использовать:

<ParameterInput>:
    text: ''
    icon: ''
    suffix: ''
    data: ''
    check_data: ''

    BoxLayout:
        Label:
            text: root.text + ':'
    BoxLayout:
        Image:
            size_hint_x: 0.2
            source: root.icon
        TextInput:
            text: root.data
            on_text: root.data = self.text
            on_focus: root.check_data(self, self.focus)
        Label:
            text: root.suffix

И вот как я хочу использовать его:

ParameterInput:
    id: temp_param
    text: 'Temperature'
    icon: './images/thermometer.png'
    suffix: '\u00B0' + 'C'
    data: app.parameters.temperature
    check_data: app.parameters.check_temp

ParameterInput:
    id: param_2
    text: 'Param 2'
    icon: './images/param_2.png'
    suffix: '\u00B0' + 'C'
    data: app.parameters.param_2
    check_data: app.parameters.check_param_2

Текст, значок и суффикс работают хорошо, потому что они просто строки, но данные являются StringProperty и не обновляются. Другая проблема заключается в том, что, если я передам метод в check_data, произойдет сбой приложения.

EDIT:

Как я могу использовать MyLayout в качестве компонента, например:

MyLayout:
    check_data1: app.ch1
    check_data2: app.ch2

Где check_data1 и check_data2 - методы кнопок.

1 Ответ

0 голосов
/ 18 апреля 2019

Не определяйте check_data как StringProperty, если вы хотите метод.
Если вы хотите, чтобы check_data походил на свойство, которому вы можете назначить функцию, вы можете сделать что-то вроде этого.

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout

class MyLayout(BoxLayout):

    def ch1(self, data):
        return str(data*2)

    def ch2(self, data):
        return str(data*4)


KV = """

MyLayout:
    Button:
        check_data: root.ch1
        text: self.check_data(42)
    Button:
        check_data: root.ch2
        text: self.check_data(42)   

"""

class TestApp(App):
    def build(self):
        return Builder.load_string(KV)

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