Kivy - 子类的引用 ID(嵌套 ID)

Kivy - Referencing IDs of Subclasses (Nested IDs)

我正在创建一个 kivy 应用程序。我对 Kivy 和 kv lang 很陌生,虽然我发现将代码逻辑和布局分开非常好,尤其是在一些 pygame 开发之后,但并没有太多关于它的谣言。 所以对于我的实际问题:我有一个屏幕管理器的 wiki-style 屏幕,由一个 BoxLayout 组成:

现在我正在重新创建导航按钮,使其成为许多网页和应用程序中已知的浮动类型。问题是,我突然不能再引用我的 ScrollView 了。有什么帮助或建议吗?

<Wiki>:
    name: "wiki"
    
    canvas.before:
        Rectangle:
            pos: self.pos
            size: self.size
            source: "picture.jpg"

    BoxLayout:
        id: box
        orientation: "vertical"
        padding: 10
        spacing: 10
    
        Label:
            font_size: 20
            size_hint_y: .1
            text: root.country_text    
            
        ScrollView:
            id: scrlvw
            BackgroundLabel:
                background_color: 220,220,220, 0.5
                size_hint_y: None
                text_size: self.width, None
                height: self.texture_size[1]
                halign: "left"
                valign: "top"
                text: root.wiki_text
        
        FloatLayout:
            size_hint_y: .1
            
            Button:
                size_hint_x: .2
                pos_hint: {"center_x": .25, "center_y": .5}
                text: "Back"
                on_release:
                    app.root.current = "main"
                    root.manager.transition.direction = "right"
                    
    FloatButton:
        size_hint_x: .2
        pos_hint: {"center_x": .75, "center_y": .5}
        text: "Up"
        on_release: 
            widget = BoxLayout()
            widget.ids.scrlvw.scroll_y = 0

之前,当它起作用时,它是:

    BoxLayout:
        FloatLayout:
            size_hint_y: .1
            
            Button:
                size_hint_x: .2
                pos_hint: {"center_x": .25, "center_y": .5}
                text: "Back"
                on_release:
                    app.root.current = "main"
                    root.manager.transition.direction = "right"

            Button:
                size_hint_x: .2
                pos_hint: {"center_x": .75, "center_y": .5}
                text: "Up"
                on_release: 
                    scrlvw.scroll_y = 0

这只是一个设计问题,我想我暂时不得不放弃浮动设计。但如果你能帮助我更好地理解这门语言,我将非常高兴。

只要 'kv' 描述为“何时有效”的代码仍在同一 <Wiki> 规则中,它就应该仍然有效。较新的 kv 代码将永远无法工作,因为您正在尝试创建新的 BoxLayout 并在其中引用 id。这有两个问题:

  1. 新创建的 BoxLayout 不是出现在您的 GUI 中的 BoxLayout 实例,因此对其进行的任何更改都不会影响显示中出现的内容。
  2. 除非您的 kv 中有 <BoxLayout> 规则,否则新创建的 BoxLayout 不会有 scrlvw id.

kv 规则中定义的 ids 只能在该规则中使用。见 documntation.