Kivy-使用动态类设置事件动作

时间:2019-04-25 14:06:05

标签: python python-3.x kivy kivy-language

我目前正在尝试触发嵌套在动态类中的某些小部件的事件。更加具体。这是一个示例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

2 个答案:

答案 0 :(得分:0)

代替直接从BoxLayoutAnchorLayout继承,您可以从用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)

注意:kv文件-为id

分配一个值

id分配值时,请记住 值不是字符串 。没有引号:

好-> id: user_selection_labelid: user_selection_spinner

不好-> id: 'user_selection_label'id: 'user_selection_spinner'

on_text中使用class InnerBox()

1)kv文件-动态类规则,UserSelectionInput

  • 创建与text的{​​{1}}属性关联的新属性

摘要

Spinner

2)kv文件-动态类规则,InnerBox

  • 使用<UserSelectionInput@BoxLayout>: text: user_selection_spinner.text ... Spinner: id: user_selection_spinner text: 'Select' values: root.sp_values 属性事件

摘要

on_text

示例

main.py

<InnerBox@AnchorLayout>:
    ...

    BoxLayout:
        ...

        UserSelectionInput:
            on_text:
                print("UserSelectionInput.spinner_1: text=", self.text)

        UserSelectionInput:
            on_text:
                print("UserSelectionInput.spinner_2: text=", self.text)