gpt4 book ai didi

python - 在单独的 .kv 文件中创建小部件的属性

转载 作者:太空宇宙 更新时间:2023-11-03 17:20:59 27 4
gpt4 key购买 nike

我正在学习编写 Kivy 应用程序。我创建了一个由两个网格布局组成的玩具应用程序。一个包含两个按钮,另一个包含两个标签。任务是在单击按钮时修改标签。当所有布局都在同一个 .kv 文件中时,我可以通过简单地以标准方式创建 id 和属性来非常简单地完成此操作。

当我将布局拆分为单独的 .kv 文件时,我无法做同样的事情。我想这样做,因为我实际正在进行的项目太复杂,无法包含在单个 .kv 文件中。这是我的代码:

主要的Python代码:

# filename DynamicApp.py
import kivy
kivy.require('1.9.0')

from kivy.app import App
from kivy.uix.relativelayout import RelativeLayout
from kivy.lang import Builder

Builder.load_file("myfirstgrid.kv")
Builder.load_file("mysecondgrid.kv")

class DynamicWidgets(RelativeLayout):
pass

class DynamicApp(App):
def build(self):
return DynamicWidgets()

if __name__ == "__main__":
DynamicApp().run()

基础 kivy 文件:

# File name: DynamicApp.kv
#:kivy 1.9.0
<DynamicWidgets>:
MyFirstGrid:

MySecondGrid:

第一个网格的 kivy

# File name: myfirstgrid.kv
#:kivy 1.9.0
<MyFirstGrid@GridLayout>
id: _my_first_grid
rows: 1
cols: 2
Label:
id: _label_1
text: "Hello World"
Label:
id: _label_2
text: "Hello World"

第二个网格的 Kivy

# File name: myseoncdgrid.kv
#:kivy 1.9.0
#:import mybutton mybutton
<MySecondGrid@GridLayout>
size_hint: 0.25, 0.25
pos_hint: {'center_x': 0.5, 'y' : 0}
rows: 1
cols: 2
MyButton:
text: 'Do it'
label_1: _label_1
MyButton:
text: 'Do it Again'
label_2: _label_2

mybutton.py 控制按钮操作,但未在此处显示,因为我无法在 MyButton 小部件中创建属性和引用,因为它给出错误 NameError: name '_label_2' is not Defined

我做了完全相同的策略,但将所有 kv 放在一个文件中,效果很好。

如何在其他 .kv 文件中创建对小部件的引用和属性。

我觉得我错过了一些基本的东西。

谢谢

最佳答案

根据 Kv Language 上的文档,“id 的范围仅限于其声明的规则”。这意味着标签 ID 在 <My*Grid@GridLayout> 之外无效。 。这是有道理的,因为规则可以应用于任何 UI 树中的小部件,并且它无法提前知道自身外部存在或不存在什么。

解决您的问题的方法是使用 Properties 。您可以将标签文本绑定(bind)到 StringProperty然后当您在代码中更改它时(按下按钮),Kivy 将为您更新标签。如果您无法轻松地相互引用小部件,则可以将属性放在 App 上。对象,它始终可以在 kv 中引用为 app .

例如(未经测试):

class DynamicApp(App):
label1 = StringProperty("Hello World")
label2 = StringProperty("Hello World")
def build(self):
return DynamicWidgets()

...

<MyFirstGrid@GridLayout>
rows: 1
cols: 2
Label:
text: app.label1
Label:
text: app.label2

...

<MySecondGrid@GridLayout>
size_hint: 0.25, 0.25
pos_hint: {'center_x': 0.5, 'y' : 0}
rows: 1
cols: 2
MyButton:
text: 'Do it'
on_press: app.label1 = "did it"
MyButton:
text: 'Do it Again'
on_press: app.label2 = "did it again"

关于python - 在单独的 .kv 文件中创建小部件的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33151756/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com