我正在用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是按钮的方法。
答案 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()