【问题标题】:How to pass methods and StringProperties through Kivy widget in kv lang如何在 kv lang 中通过 Kivy 小部件传递方法和 StringProperties
【发布时间】:2019-04-18 21:18:05
【问题描述】:

我正在 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 是按钮的方法。

【问题讨论】:

    标签: python kivy


    【解决方案1】:

    如果你想要一个方法,不要将 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()
    

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多