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

In Kivy.kv file how do I reference a method in another class

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

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))

通常,您会在应用中的某处有一个 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 class 在 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 可以是:

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))