在KIvy接触儿童的儿童

时间:2017-02-26 11:17:15

标签: python kivy

很抱歉,如果图像很大

Sorry if the image is huge

行。所以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。

但是,无论如何。我想我说的是这个。如果我想访问自定义小部件的子级:

  1. 在屏幕对象中
  2. 在Python中
  3. 在MyScreen()类下
  4. 我该怎么办?

    谢谢!

    额外信用:告诉我你是如何了解这一点的!

1 个答案:

答案 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,所以我不记得它是否有很多关于嵌套的内容。但希望在这个例子中,这似乎是一种合乎逻辑的方式。