gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:12:34 24 4
gpt4 key购买 nike

假设我有一个 ThemeManager 对象作为我的 RootWidget 中的类属性,如下所示:

class RootWidget(Widget):
theme = ThemeManager()

ThemeManager 定义一个返回十六进制颜色的函数。

class ThemeManager:    
def get_color(self):
return '#ffffffff'

假设我使用 kv 文件在 RootWidget 中创建了一个 Button。我如何从 kv 文件调用 ThemeManager 函数?这是一个不起作用的示例:

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

最佳答案

既然你的问题已经得到解答,这里是一个解释,它实际上非常简单(我认为)。

当您的 Button 尝试读取函数时,app.root 为 None。因为事情的顺序是(松散的):-

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

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

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

有趣的是,root 没有在 app.py 中定义为 ObjectProperty,这意味着您无法像标题和图标那样绑定(bind)到其中的更改。但不确定它是否会改变,所以这可能没有实际意义。

关于python - 如何通过调用 Kivy Python 中的函数来设置小部件属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33952376/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com