我目前正在尝试触发嵌套在动态类中的某些小部件的事件。更加具体。这是一个示例kv文件:
<UserSelectionInput@BoxLayout>:
orientation: 'horizontal'
size_hint: None, 1
spacing: 4
lb_text: ''
lb_id: 'user_selection_label'
sp_values: '', ''
sp_id: 'user_selection_spinner'
Label:
id: root.lb_id
size_hint_x: 0.4
text: root.lb_text
Spinner:
id: root.sp_id
text: 'Select'
values: root.sp_values
<InnerBox@AnchorLayout>:
anchor_x: 'center'
anchor_y: 'center'
BoxLayout:
orientation: 'horizontal'
size_hint: None, 1
width: 2 * root.width / 3
spacing: 1
UserSelectionInput:
width: root.width / 3
sp_values: 'A', 'B', 'C'
lb_text: 'Type'
lb_id: 'label_1'
sp_id: 'spinner_1'
UserSelectionInput:
width: root.width / 3
sp_values: 'D', 'E', 'F', 'G'
lb_text: 'Version'
lb_id: 'label_2'
sp_id: 'spinner_2'
<MainContent>:
rows: 3
Label:
text: "Some Text"
GridLayout:
cols: 1
InnerBox:
我现在要做的是在'InnerBox'布局内使用微调器的'on_text'事件从关联的.py文件中调用函数。我不确定这是否是最好的方法,但就可重用性而言,我想对小部件的某些组合使用动态类的概念。
Julz
答案 0 :(得分:0)
代替直接从BoxLayout
和AnchorLayout
继承,您可以从用python代码声明的子类以及要提供的函数继承:
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder
Builder.load_string("""
<MyNewWidget@MyBoxLayout>:
Button:
text: "test"
on_press: root.my_function()
<MainWidget>:
MyNewWidget
""")
class MyBoxLayout(BoxLayout):
def my_function(self):
print("MyBoxLayout")
class MainWidget(BoxLayout):
pass
class MyApp(App):
def build(self):
return MainWidget()
if __name__ == "__main__":
MyApp().run()
答案 1 :(得分:0)
id
为id
分配值时,请记住 值不是字符串 。没有引号:
好-> id: user_selection_label
或id: user_selection_spinner
不好-> id: 'user_selection_label'
或id: 'user_selection_spinner'
on_text
中使用class InnerBox()
text
的{{1}}属性关联的新属性Spinner
<UserSelectionInput@BoxLayout>:
text: user_selection_spinner.text
...
Spinner:
id: user_selection_spinner
text: 'Select'
values: root.sp_values
属性事件on_text
<InnerBox@AnchorLayout>:
...
BoxLayout:
...
UserSelectionInput:
on_text:
print("UserSelectionInput.spinner_1: text=", self.text)
UserSelectionInput:
on_text:
print("UserSelectionInput.spinner_2: text=", self.text)