Kivykv-lang:在画布说明中使用自定义属性 背景问题

问题描述

背景

说我想创建一个具有随机颜色背景的自定义样式标签(示例取自Kivy wiki)。我会

#:import rand_float random.uniform

<-CustomLabel>:
        bg_color: [rand_float(0.3,0.7) for _ in range(3)]
    canvas:
        Color:
            rgb: self.bg_color
        Rectangle:
            pos: self.pos
            size: self.size

但是,当我尝试使用它时,我会得到

 ...
      15:    canvas.before:
      16:        Color:
 >>   17:            rgb: self.bg_color
      18:        Rectangle:
      19:            pos: self.pos
 ...
 TypeError: 'NoneType' object is not subscriptable

如果该属性是一个简单列表,例如[1,0],所以我猜绑定的属性仅在运行Canvas指令后才初始化。

要绕过它,我可以做一个rgb: self.bg_color if self.bg_color else [0,0]技巧-但这确实会很快变得很嘈杂-或者我可以

class CustomLabel(Label):
    bg_color = ListProperty([0,0])

可修复此问题的Python文件内部。

问题

如果我想直接覆盖canvas,如何在Label中使用自定义属性?即,如何使它正常工作(如上所述,无需检查属性是否存在)?

# pylint: disable=no-name-in-module,no-member

from kivy.config import Config
Config.set('kivy','log_level','debug')

from kivy.app import App  # noqa: E402
from kivy.lang import Builder  # noqa: E402


KV = """
#:import rand_float random.uniform

<-Label>:
    bg_color: [rand_float(0.3,0.7) for _ in range(3)]
    canvas.before:
        Color:
            rgb: self.bg_color
        Rectangle:
            pos: self.pos
            size: self.size


Label:
    text: 'A label'
"""


class TestApp(App):
    def build(self):
        return Builder.load_string(KV)


if __name__ == '__main__':
    TestApp().run()

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)