在 Kivy.kv 文件中,我如何引用另一个类中的方法

Posted

技术标签:

【中文标题】在 Kivy.kv 文件中,我如何引用另一个类中的方法【英文标题】:In Kivy.kv file how do I reference a method in another class 【发布时间】:2021-12-02 01:08:16 【问题描述】:

我很难理解 kivy.kv 文件和类之间的关系。 我编写了一个包含两个类 Test3App 和 Restore 的简单应用程序,其中包含两个按钮和一个标签。 单击还原按钮时出现错误: AttributeError:“Test3App”对象没有属性“Restore”。 我的问题是:如何在 kv 或 python 文件中引用 Restore 类?

test3.py

from kivy.app import App

class Test3App(App): 

    def enlarge_text(self):
        if self.root.ids.label.font_size <90:
            self.root.ids.label.font_size += 16
        else:
            self.root.ids.but1.text = ' font_size at\n[b][size=20]Maximum'
            self.root.ids.but1.color = 'yellow'

class Restore():

    def font_size_reset(self):
        self.root.ids.label.font_size = 16
        self.root.ids.but1.text = 'font_size\nEnlarge'
        self.root.ids.but1.color = 'white'

if __name__ == '__main__':
    Test3App().run()

test3.kv

BoxLayout:

    Button:
        id: but1
        text: 'font_size\nEnlarge'
        on_press: app.enlarge_text()
        markup: True
  
    Button:
        text: 'font_size\nRestore'
        on_press: app.Restore.font_size_reset() 
  
    Label:
        id: label
        font_size: 16
        text: str(int(label.font_size))

【问题讨论】:

我很困惑。为什么你不能把你的font_size_reset 方法放到Test3App 上呢? 我可以拥有,但我试图了解类和 kv 文件的关系,并认为有人可以让我走上正确的道路。 好吧,很酷,所以我还有一个问题要问:Restore 类是否有任何关系,或者至少出现在您的 .kv 文件中的任何位置? 恢复类不在kv文件中。目前它的唯一目的是重置 font_size。我想了解的是如何将一个类中的属性(方法/变量)引用到另一类中的属性(方法/变量)。我假设我需要在 python 或 kv 脚本中引用 Restore 类来创建链接,但我不知道该怎么做。 【参考方案1】:

通常,您的应用程序中的某处会有一个Restore 的实例,并且您会在您的kv 中引用该实例。这是在kv 中访问font_size_reset() 方法的一种方法:

#: import Restore test3.Restore
BoxLayout:

    Button:
        id: but1
        text: 'font_size\nEnlarge'
        on_press: app.enlarge_text()
        markup: True

    Button:
        text: 'font_size\nRestore'
        on_press: Restore.font_size_reset('Abba')

    Label:
        id: label
        font_size: 16
        text: str(int(label.font_size))

import 使Restore 类在kv 中可用。对font_size_reset() 的调用提供了一个无意义的参数,因为该方法需要self(但不使用它)。为此,必须重新定义 font_size_reset() 方法以访问应用程序的 root 小部件:

class Restore():

    def font_size_reset(self):
        root = App.get_running_app().root  # get a reference to the app root widget
        root.ids.label.font_size = 16
        root.ids.but1.text = 'font_size\nEnlarge'
        root.ids.but1.color = 'white'

更好的方法是将font_size_reset() 方法设为静态,这样就不需要无意义的参数。在这种方法中,Restore 类可以是:

class Restore():
    @staticmethod
    def font_size_reset():
        root = App.get_running_app().root  # get a reference to the app root widget
        root.ids.label.font_size = 16
        root.ids.but1.text = 'font_size\nEnlarge'
        root.ids.but1.color = 'white'

以及对应的test3.kv:

#: import Restore test3.Restore
BoxLayout:

    Button:
        id: but1
        text: 'font_size\nEnlarge'
        on_press: app.enlarge_text()
        markup: True

    Button:
        text: 'font_size\nRestore'
        on_press: Restore.font_size_reset()

    Label:
        id: label
        font_size: 16
        text: str(int(label.font_size))

【讨论】:

请您解释一下#:import Restore test3.Restore 的语法,因为我不太明白它在做什么。您对我的问题的解释很容易理解,谢谢。 kv 文件中的import 正在导入test3.Restore,即test3.py 文件中的Restore 类,并为其分配名称Restore。请参阅documentation。

以上是关于在 Kivy.kv 文件中,我如何引用另一个类中的方法的主要内容,如果未能解决你的问题,请参考以下文章

Kivy - 使用 .kv

Kivy 中的多行注释

如何在 OSX 上的 Pycharm 中获得 Kivy、.kv、文件的语法高亮显示? [复制]

在目标 C 中引用另一个类中的实例化对象

一个项目如何引用另一个项目中类中的方法

Kivy - Kv - ScreenManager - 改变当前屏幕