如何通过kv lang中的Kivy小部件传递方法和StringProperties

时间:2019-04-18 02:59:40

标签: python kivy

我正在用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中传递一个方法,应用程序将崩溃。

编辑:

如何将MyLayout用作组件,例如:

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

其中check_data1和check_data2是按钮的方法。

1 个答案:

答案 0 :(得分:0)

如果要使用方法,请不要将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()