当前位置: 首页 > 面试题库 >

如何从Kivy文件(.kv)访问不同类别的ID /小部件?

戚弘和
2023-03-14
问题内容

我想知道什么?

  1. 如果释放具有ID:button_b(Get_Boys类)的按钮,则必须更改具有ID:label_g(Get_Girls类)的Label。
  2. 如果按下ID为:button_b的Button(Get_Boys类),则ID为root_lbl的Label(Get_People类)必须更改。
  3. 如果发布了ID为:root_btn(Get_People类)的Button,则ID为:label_b(Get_Boys类)的Label必须更改。

在此链接中对此进行了解释(很少),但没有从初学者的角度进行解释。

我有2个档案

  1. test.py
  2. date_test.kv

test.py

class Get_People(BoxLayout):
    pass

class Get_Boys(BoxLayout):
    pass

class Get_Girls(BoxLayout):
    pass

class TestApp(App):
    def build(self):
        self.load_kv('dates_test.kv')
        return Get_People()

date_test.kv文件

<Get_People>:
    orientation: 'vertical'
    Button:
        name: root_btn
        id: root_btn
        text: "I am Root Button"
        on_release: change_label_b
    Label:
        id: root_lbl
        text: "I am Root Label"
    Get_Boys:
    Get_Girls:

<Get_Boys>:
    Button:
        id: button_b
        text: "Button for boys"
        on_press: change_label_root
        on_release: change_label_g
    Label:
        id: label_b
        text: "Label for boys"

<Get_Girls>:
    Button:
        id: button_g
        text: "Button for girls"
    Label:
        id: label_g
        text:"Label for girls"

问题答案:

好吧,看来我自己找到了答案,我想分享一下。

首先,让我们在dates_test.kv文件中输入“ id”。这样您就可以使用python代码或.kv文件访问它们。

<Get_People>:
    stuff_p: root_lbl
    ...
    Get_Boys:
        id: gb
    Get_Girls:
        id: gg

<Get_Boys>:
    stuff_b: label_b

<Get_Girls>:
    stuff_c: label_g

您可能想知道什么是stuff_p,stuff_b和stuff_c ???

它们是在自己的类中定义的ObjectProperty。当您链接到kivy文件时,您在python代码中的stuff_b中所做的更改将在label_b中进行更改。

class Get_People(BoxLayout):
    stuff_p = ObjectProperty(None)
    ...

class Get_Boys(BoxLayout):
    stuff_b = ObjectProperty(None)
    ...

class Get_Girls(BoxLayout):
    stuff_c = ObjectProperty(None)
    ...

对于第1部分和第2部分

  1. 如果释放具有ID:button_b(Get_Boys类)的按钮,则必须更改具有ID:label_g(Get_Girls类)的Label。

  2. 如果按下ID为:button_b的Button(Get_Boys类),则ID为root_lbl的Label(Get_People类)必须更改。

在Get_Boys类(test.py)中定义这些方法。

def change_girl(self):

    self.parent.ids.gg.stuff_c.text = "Boys changed Girls!"
    #self.stuff_b.text = "i changed myself!"

def change_people(self):
    self.parent.ids.root_lbl.text = "Boys changed people!"

让我们看看这里发生了什么…

self.parent.ids.gg.stuff_c.text =“男孩变了女孩!”

  1. self.parent引用Get_Parent类。
  2. .ids.gg是我们上面为Get_Girls创建的ID。
  3. .stuff_c用于引用Get_Girls类中的label_g(上方)。
  4. .text用于更改标签中的文本。

并在.kv文件中

<Get_Boys>:
    stuff_b: label_b
    Button:
        id: button_b
        text: "button 1"
        on_release: root.change_girl()
        on_press: root. change_people()

对于第3部分

3.
如果发布了ID为:root_btn(Get_People类)的Button,则ID为:label_b(Get_Boys类)的Label必须更改。


在Get_People类(test.py)中定义一个方法

def rooted(self):
    self.ids.gb.stuff_b.text = "people changed boys!"

并在.kv文件中

Button:
    id: root_btn
    text: "I am Root"
    on_release: root.rooted()


 类似资料:
  • 我在刷新小部件的BoxLayout时遇到了问题,方法是删除它们,然后根据列表“组”重新构建小部件。在EditDeviceGroups屏幕上,“创建”按钮应向列表中添加一个元素,并将用户转发到GroupTemplateScreen,确实如此。 当用户使用“后退”按钮返回到EditDeviceGroups屏幕时,会出现此问题。当时,我认为on_enter方法将刷新小部件以包含新元素,但列表中没有显示任

  • 问题内容: 我有以下项目结构 如何从ConfigManager.py访问constants.cfg。 我有一个限制 我无法提供constants.cfg的完整路径(绝对路径),因为如果我在其他PC上运行,则无需进行任何修改 另外,如果我代表以下内容,则可以访问该文件。但是我不想每次都回击 目前,我正在做这样的事情。但这仅在constants.cfg和ConfigManager.py位于同一目录中时

  • 我试着用Kivy模仿flappy birds,但目前我的处境很艰难。问题是我不知道如何在视图中创建多个小部件。 现在我的kv文件中有: 目前我能够制作单列,所以问题是如何制作才能有多列?

  • 我正在使用Kivy python库。 我定义了两个小部件。 当程序运行时,我运行第一个小部件。 当按下widgets按钮时,我希望它消失并被第二个widget替换。 这是两个小部件的. kv 我的主python文件运行应用程序,并返回第一个小部件 我的第一个小部件有一个回调。这就是问题代码所属的位置 这里的想法是有一个用户界面管理器。此管理器不像树那样运行UI,而是像列表和堆栈一样运行UI。该列表

  • 我一直在玩KivyPong教程,了解框架的最新情况,看看是否可以实现一些想法。我已经删除了大部分乒乓球功能,所以我只能在屏幕上显示弹跳球,并添加了一些代码来生成屏幕上的多个弹跳球,在触摸时生成。效果很好。然后,我添加了一些额外的画布说明,因此我将绘制一条线,指示球移动的方向。这就是事情变得奇怪的地方。第一个球的动作就像它应该做的一样,在屏幕上弹跳。但接下来的任何点击都会产生球,球会离开屏幕,随机改

  • 问题内容: 是否可以从Java内部类中获取对它的引用? 即 问题答案: 您可以像这样访问外部类的实例: