如何通过调用Kivy Python中的函数来设置窗口小部件属性?

时间:2015-11-27 07:35:51

标签: python kivy

假设我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()

1 个答案:

答案 0 :(得分:1)

由于您的问题已经得到解答,这里的解释非常简单(我认为)。

在您尝试阅读该功能时,

app.root为None。因为事物的顺序是(松散地): -

  1. 创建RootWidget
  2. 一旦它及其所有孩子完成( init 完成),对象就会传递给build()
  3. 中的行
  4. app.root仅在调用TestApp.run()
  5. 时设置

    至于为什么3.发生,app.py中的 init 方法将self.root初始化为None。然后可以通过load_kv(加载与此应用程序同名的kv)或运行(大多数情况下都会发生这种情况)来设置它。

    因此,您可以在on_press事件中调用app.root(因为这些仅在完全创建应用时响应用户交互而发生),而不是在一次性窗口小部件初始化事件中。

    有趣的是,root在app.py中没有被定义为ObjectProperty,这意味着你不能像标题和图标一样绑定到它中的变化。不确定它是否会改变,所以这可能没有用。