标签与背景颜色与容器作为屏幕不显示背景颜色

时间:2014-04-17 07:19:57

标签: python kivy

我正在尝试使用背景颜色的标签。基本上它看起来像一个带有矩形的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()

1 个答案:

答案 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)。