假设我ThemeManager
中有一个RootWidget
对象作为类属性,如下所示:
class RootWidget(Widget):
theme = ThemeManager()
ThemeManager
定义了一个返回十六进制颜色的函数。
class ThemeManager:
def get_color(self):
return '#ffffffff'
我们假设我使用Button
文件在RootWidget
中创建kv
。如何从ThemeManager
文件中调用kv
函数?这是一个不起作用的例子:
import kivy
kivy.require('1.9.0')
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.widget import Widget
from kivy.lang import Builder
class ThemeManager:
def get_color(self):
return '#ffffffff'
class RootWidget(Widget):
theme = ThemeManager()
my_kv = Builder.load_string("""
#: import get_color_from_hex kivy.utils.get_color_from_hex
RootWidget:
Button:
color: get_color_from_hex(app.root.theme.get_color())
text: "Test"
""")
class TestApp(App):
def build(self):
return my_kv
if __name__ == '__main__':
TestApp().run()
答案 0 :(得分:1)
由于您的问题已经得到解答,这里的解释非常简单(我认为)。
在您尝试阅读该功能时,app.root为None。因为事物的顺序是(松散地): -
至于为什么3.发生,app.py中的 init 方法将self.root初始化为None。然后可以通过load_kv(加载与此应用程序同名的kv)或运行(大多数情况下都会发生这种情况)来设置它。
因此,您可以在on_press事件中调用app.root(因为这些仅在完全创建应用时响应用户交互而发生),而不是在一次性窗口小部件初始化事件中。
有趣的是,root在app.py中没有被定义为ObjectProperty,这意味着你不能像标题和图标一样绑定到它中的变化。不确定它是否会改变,所以这可能没有用。