【问题标题】:Kivy - Referencing IDs of Subclasses (Nested IDs)Kivy - 引用子类的 ID(嵌套 ID)
【发布时间】:2021-04-29 11:31:06
【问题描述】:

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

  • 标题作为标签
  • 文本的可滚动标签(稍后会显示嵌套的kv文件)
  • 导航按钮(向上滚动并返回主屏幕)

现在,我将导航按钮重新创建为许多网页和应用程序中已知的浮动类型。问题是,我突然不能再引用我的 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

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

【问题讨论】:

    标签: python android kivy kivy-language


    【解决方案1】:

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

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

    kv 规则中定义的ids 只能在该规则中使用。请参阅documntation

    【讨论】:

    • 我明白了我的错误:所以我必须将我的 FloatButton 类放在 BoxLayout 规则中,因为那是存储 scrlvw id 的地方。我可能必须在Box Layout 规则上方设置FloatLayout,以便FloatButton 不会与设计混淆,并找到一种方法来设置与动态类一起使用的on_release 事件。感谢您的帮助。
    • 所以我重新编写了代码,通过一个简单的按钮类删除了我的 FloatButton 动态类,一切正常。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-11
    • 1970-01-01
    相关资源
    最近更新 更多