Python KIVY:选择正确的ID

时间:2017-11-28 15:47:42

标签: python kivy

我试图从python代码访问子ID(在kv文件中)。 我知道可以简单地给出要打印的文本作为参数,但这不是我的真实代码所以我需要能够选择任何子ID。

debug.py:

#:kivy 1.10.0

<MyScreenManager>:

    Menu_A:
        name: "screen_A"
        id: menu_a

        BoxLayout:
            id: box_1

        BoxLayout:
            id: box_2

            BoxLayout:
                id: box_2a

                Button:
                    id: btn
                    text: "print me"
                    on_press: root.ids.menu_a.action()

debug.kv:

T1 P1 phi1 EGR1 S
T1 P2 phi1 EGR1 S
.
.
.
T1 P12 phi1 EGR1 S
T1 P13 phi1 EGR1 S
T1 P1 phi2 EGR1 S
T1 P2 phi2 EGR1 S
.
.
.
T1 P12 phi2 EGR1 S
T1 P13 phi2 EGR1 S
.
.
.
.
.
.
T28 P1 phi5 EGR1 S
T28 P2 phi5 EGR1 S
.
.
.
T28 P12 phi5 EGR1 S
T28 P13 phi5 EGR1 S

2 个答案:

答案 0 :(得分:0)

你的btn在你的经理的ids中,所以你可以直接访问他:

def action(self):
    print(self.manager.ids.btn.text)

在您的kv中,您可以使用menu_a代替root.ids.menu_a

答案 1 :(得分:0)

使用ObjectProperty

访问文本

在该示例中,我们使用ObjectProperty来连接按钮来访问文本,因为id是小部件的弱参数。 使用ObjectProperty创建直接引用,提供更快的访问权限,更明确 。它通常被认为是使用ObjectProperty的“最佳实践”。

MyScreenManager类

默认情况下,添加到ScreenManager中的第一个屏幕将是 显示。因此,无需重载__init__方法并设置要显示的第一个屏幕。

实施例

以下示例说明了使用ObjectProperty和self.ids在两个单独的print语句中访问按钮的文本。

debug.py

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty
from kivy.lang import Builder


class MyScreenManager(ScreenManager):
    pass


class Menu_A(Screen):
    obj = ObjectProperty(None)

    def __init__(self, **kwargs):
        super(Menu_A, self).__init__(**kwargs)

    def action(self):
        print("Using self.obj.text={}".format(self.obj.text))    # using an ObjectProperty
        print("Using self.ids.btn.text={}".format(self.ids.btn.text))    # using self.ids


Builder.load_file("debug.kv")


class MyAppli(App):

    def build(self):
        return MyScreenManager()

if __name__ == '__main__':
    MyAppli().run()

debug.kv

#:kivy 1.10.0

<MyScreenManager>:

    Menu_A:
        name: "screen_A"
        id: menu_a

<Menu_A>:
    obj: btn
    BoxLayout:
        id: box_1

    BoxLayout:
        id: box_2

        BoxLayout:
            id: box_2a

            Button:
                id: btn
                text: "print me"
                on_press: root.manager.ids.menu_a.action()

输出

Figure 1 - App Startup Figure 2 - Clicked Button