在 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 文件中,我如何引用另一个类中的方法的主要内容,如果未能解决你的问题,请参考以下文章