Kivy - 子类的引用 ID(嵌套 ID)
Kivy - Referencing IDs of Subclasses (Nested IDs)
我正在创建一个 kivy 应用程序。我对 Kivy 和 kv lang 很陌生,虽然我发现将代码逻辑和布局分开非常好,尤其是在一些 pygame 开发之后,但并没有太多关于它的谣言。
所以对于我的实际问题:我有一个屏幕管理器的 wiki-style 屏幕,由一个 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
这只是一个设计问题,我想我暂时不得不放弃浮动设计。但如果你能帮助我更好地理解这门语言,我将非常高兴。
只要 'kv' 描述为“何时有效”的代码仍在同一 <Wiki>
规则中,它就应该仍然有效。较新的 kv
代码将永远无法工作,因为您正在尝试创建新的 BoxLayout
并在其中引用 id
。这有两个问题:
- 新创建的
BoxLayout
不是出现在您的 GUI 中的 BoxLayout
实例,因此对其进行的任何更改都不会影响显示中出现的内容。
- 除非您的
kv
中有 <BoxLayout>
规则,否则新创建的 BoxLayout
不会有 scrlvw
id
.
kv
规则中定义的 ids
只能在该规则中使用。见 documntation.
我正在创建一个 kivy 应用程序。我对 Kivy 和 kv lang 很陌生,虽然我发现将代码逻辑和布局分开非常好,尤其是在一些 pygame 开发之后,但并没有太多关于它的谣言。 所以对于我的实际问题:我有一个屏幕管理器的 wiki-style 屏幕,由一个 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
这只是一个设计问题,我想我暂时不得不放弃浮动设计。但如果你能帮助我更好地理解这门语言,我将非常高兴。
只要 'kv' 描述为“何时有效”的代码仍在同一 <Wiki>
规则中,它就应该仍然有效。较新的 kv
代码将永远无法工作,因为您正在尝试创建新的 BoxLayout
并在其中引用 id
。这有两个问题:
- 新创建的
BoxLayout
不是出现在您的 GUI 中的BoxLayout
实例,因此对其进行的任何更改都不会影响显示中出现的内容。 - 除非您的
kv
中有<BoxLayout>
规则,否则新创建的BoxLayout
不会有scrlvw
id
.
kv
规则中定义的 ids
只能在该规则中使用。见 documntation.