我正在尝试使用背景颜色的标签。基本上它看起来像一个带有矩形的Label,上面有不同的颜色。如果我使用父作为Widget,但如果我将父改变为屏幕,我需要使用屏幕,这完全没问题。彩色矩形即背景颜色或标签消失。可以提一些建议。以下是两者的代码。 1.使用Widget容器 2.不使用Screen Container< - 需要建议
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.label import Label
from kivy.uix.widget import Widget
from kivy.properties import ListProperty
from kivy.uix.screenmanager import ScreenManager, Screen,FallOutTransition
kvCode=('''
<CLabel@Label>:
canvas.before:
Color:
rgb: self.bgcolor
Rectangle:
size: self.size
pos: self.pos
''')
class CLabel(Label):
bgcolor = ListProperty([0,0,0])
class Container(Widget):
def __init__(self, **kwargs):
super(Container, self).__init__(**kwargs)
labelWithBackground = CLabel(text="Coloured background",bgcolor= [.45,.46,.52,1])
labelWithBackground.center = 100,100
self.add_widget(labelWithBackground)
class MyJB(App):
def build(self):
Builder.load_string(kvCode)
parent = Container()
return parent
if __name__ == '__main__':
MyJB().run()
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.label import Label
from kivy.uix.widget import Widget
from kivy.properties import ListProperty
from kivy.uix.screenmanager import ScreenManager, Screen,FallOutTransition
kvCode=('''
<CLabel@Label>:
canvas.before:
Color:
rgb: self.bgcolor
Rectangle:
size: self.size
pos: self.pos
''')
class CLabel(Label):
bgcolor = ListProperty([0,0,0])
class Container(Screen,Widget):
def __init__(self, **kwargs):
super(Container, self).__init__(**kwargs)
labelWithBackground = CLabel(text="Coloured background",bgcolor=[.45,.46,.52,1])
labelWithBackground.center = 100,100
self.add_widget(labelWithBackground)
class MyJB(App):
def build(self):
sm = ScreenManager(transition= FallOutTransition())
sm.add_widget(Container(name='loading'))
Builder.load_string(kvCode)
return sm
if __name__ == '__main__':
MyJB().run()
答案 0 :(得分:1)
问题是您在创建窗口小部件之前不会加载您的kv规则。如果先加载它们,它可以正常工作。
您可以随时加载规则 - 而不仅仅是build()
。因此,您只需从Builder.load_string(kvCode)
移除build()
,然后将kvCode=('''
更改为Builder.load_string('''
即可。我在我创建的每个小部件文件的顶部放了一个Builder.load_string()
。
此外,Kivy支持更高级的属性设置,可以更好地工作。这是我们这样做的方式:
from kivy.uix.widget import Widget
from kivy.lang import Builder
from kivy.properties import BoundedNumericProperty, ReferenceListProperty
from kivy.uix.label import Label
Builder.load_string('''
<BackgroundWidget>:
canvas.before:
Color:
rgba: self.background_color
Rectangle:
size: root.size
pos: root.pos
''')
class BackgroundWidget(Widget):
'''BackgroundWidget class
'''
background_color_r = BoundedNumericProperty(0., min=0., max=1.)
background_color_g = BoundedNumericProperty(0., min=0., max=1.)
background_color_b = BoundedNumericProperty(0., min=0., max=1.)
background_color_a = BoundedNumericProperty(0., min=0., max=1.)
background_color = ReferenceListProperty(background_color_r, background_color_g, background_color_b, background_color_a)
class BackgroundLabel(BackgroundWidget, Label): pass
您可以单独更改或设置每个颜色组件的动画,颜色值受到适当约束,BackgroundWidget
是一个mixin,可为任何窗口小部件添加背景功能(如BackgroundLabel
)。