问题描述
背景
说我想创建一个具有随机颜色背景的自定义样式标签(示例取自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 (将#修改为@)