很抱歉,如果图像很大
行。所以here's my complete code。它是中等大小的,所以它只是供参考 - 而不是要求理解代码。
因此,如果我想在Python中的Layout中访问Button(),Label()或TextInput()对象,我可以执行self.ids.object_name.property_of_object。
但是,假设我有一个ScreenManager(),ScreenManager()中的Screen(),以及该屏幕对象中的自定义布局MyCustomLayout()。至于我能够得到的结果 - 我无法从MyCustomLayout()中获取来自Screen()的Python代码的ID。
即。假设在MyCustomLayout()中有一个按钮my_button的id。我想改变文字。
如果我在MyCustomLayout()课程下,这将有效:
self.ids.my_button.text = 'My new text!'
但是让我说我在MyScreen()中,它拥有MyCustomLayout()。我无法得到:
self.ids.my_button.text doesn't work
self.ids.my_custom_layout.my_button.text doesn't work
实际上,self.ids返回{}。由于某些原因,它甚至没有填充ObservableDict。
但是,无论如何。我想我说的是这个。如果我想访问自定义小部件的子级:
我该怎么办?
谢谢!
额外信用:告诉我你是如何了解这一点的!
答案 0 :(得分:2)
您可以在kvlang中为对象指定id。 id: mybutton
在下面的示例中,我将按钮的文本设置为第一个屏幕输入时的随机数
在第二个屏幕中,我只是在输入时打印该屏幕及其子节点上的所有ID。
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from random import choice
Builder.load_string('''
<MyCustomLayout1>:
Button:
id: mybutton
text: "Goto 2"
on_release: app.sm.current = "screen2"
<MyCustomLayout2>:
Button:
id: mybutton
text: "Goto 1"
on_release: app.sm.current = "screen1"
<Screen1>:
MyCustomLayout1:
id: mylayout
<Screen2>:
MyCustomLayout2:
id: mylayout
''')
class Screen1(Screen):
def on_enter(self,*args):
self.ids.mylayout.ids.mybutton.text = str(choice(range(100)))
class Screen2(Screen):
def on_enter(self,*args):
print(self.ids)
print(self.ids.mylayout.ids)
class MyCustomLayout1(BoxLayout):
pass
class MyCustomLayout2(BoxLayout):
pass
class MyApp(App):
def build(self):
self.sm = ScreenManager()
self.sm.add_widget(Screen1(name='screen1'))
self.sm.add_widget(Screen2(name='screen2'))
return self.sm
MyApp().run()
当您嵌套对象时,您可以执行obj.ids.obj.ids
等等
即使它不是问题的一部分,我也可以提一下,为了从boxlayout访问screenmanager,最好让screenmanager成为App类的一个属性。这样你就可以在kvlang中将其作为app.sm
你通过询问我在哪里学到这一点来结束你的问题 嗯,你得到的一切都是正确的,你只是没有得到正确的嵌套。我从kivy的api参考kvlang中学到了kvlang,所以我不记得它是否有很多关于嵌套的内容。但希望在这个例子中,这似乎是一种合乎逻辑的方式。