我试图从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
答案 0 :(得分:0)
你的btn在你的经理的ids中,所以你可以直接访问他:
def action(self):
print(self.manager.ids.btn.text)
在您的kv中,您可以使用menu_a
代替root.ids.menu_a
答案 1 :(得分:0)
在该示例中,我们使用ObjectProperty来连接按钮来访问文本,因为id是小部件的弱参数。 使用ObjectProperty创建直接引用,提供更快的访问权限,更明确 。它通常被认为是使用ObjectProperty的“最佳实践”。
默认情况下,添加到ScreenManager中的第一个屏幕将是 显示。因此,无需重载__init__方法并设置要显示的第一个屏幕。
以下示例说明了使用ObjectProperty和self.ids在两个单独的print语句中访问按钮的文本。
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()
#: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()