带有背景色的标签,容器作为屏幕剂量显示背景

2024-10-01 15:38:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我想要一个背景色的标签。基本上它看起来像一个标签,上面有一个不同颜色的矩形。如果我使用父控件作为窗口小部件,这完全可以工作,但是如果我将父对象更改为与我需要使用屏幕一样的屏幕,则彩色矩形即背景色或标签将消失。我能给你一个建议。下面是这两个的代码。 1使用Widget容器 2不使用屏幕容器<;--此处需要建议

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

Tags: fromimportselfappcontainerbuilderwidgetlabel
1条回答
网友
1楼 · 发布于 2024-10-01 15:38:45

问题是,在创建小部件之前,您不会加载kv规则。如果你先加载,效果很好。在

您可以随时加载规则,而不仅仅是在build()中。所以您只需将Builder.load_string(kvCode)build()中删除,并将kvCode=('''改为{}。我在我创建的每个小部件文件的顶部都放了一个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)。在

相关问题 更多 >

    热门问题