在 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))
我很难理解 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))