Use Label
使用自定义背景颜色,然后将其放入您的布局中。例如:
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ListProperty
from kivy.app import App
from kivy.lang import Builder
from random import random
kv = '''
<ColoredLabel>:
background_color:
canvas.before:
Color:
rgba: self.background_color
Rectangle:
pos: self.pos
size: self.size
'''
Builder.load_string(kv)
class ColoredLabel(Label):
background_color = ListProperty((0, 0, 0, 1))
class TestApp(App):
def build(self):
layout = BoxLayout(size_hint=(1, None), height=50)
for label in ('a', 'b', 'c', 'd'):
label = ColoredLabel(text=label, background_color=(random(), random(), random(), 1))
layout.add_widget(label)
return layout
if __name__ == '__main__':
TestApp().run()
update
修复 OP 的问题:
import kivy
from kivy.app import App
from kivy.uix.anchorlayout import AnchorLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.video import Video
from kivy.uix.relativelayout import RelativeLayout
from kivy.graphics import *
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from random import random
from kivy.properties import ListProperty
kv = '''
<ColoredLabel>:
size: (100,100)
pos: (10,10) # no effect
background_color:
canvas.before:
Color:
rgba: self.background_color
Rectangle:
pos: self.pos
size: self.size
'''
Builder.load_string(kv)
class ColoredLabel(Label):
background_color = ListProperty((0,0,0,1))
class MyApp(App):
def build(self):
f = AnchorLayout()
g = GridLayout(cols=2, rows=2)
layout = BoxLayout(size_hint=(1, None), height=50)
# v = Video(source='driver.mp4', state='play', options={'eos':'loop'})
l1 = Label(text="jenkins", font_size=32)
l2 = Label(text="git", font_size=32)
# f.add_widget(v)
label = ColoredLabel(text="Hello World!", size_hint=(None, None), background_color=(random(), random(), random(), 1))
g.add_widget(label)
f.add_widget(g)
return f
if __name__ == "__main__":
MyApp().run()
请注意Rectange
of ColoredLabel
需要有pos: self.pos
and size: self.size
在标签实际所在的位置绘制。这就是为什么我在上面的级别中更改了标签本身的大小。画布大小与其绑定。至于位置,它是由 Layout 控制的,其中ColoredLabel
已放置,因此将其更改为ColoredLabel
类没有太大变化。将其与FloatLayout
:
import kivy
from kivy.app import App
from kivy.uix.anchorlayout import AnchorLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.video import Video
from kivy.uix.relativelayout import RelativeLayout
from kivy.graphics import *
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from random import random
from kivy.properties import ListProperty
from kivy.uix.floatlayout import FloatLayout
kv = '''
<ColoredLabel>:
size: (150, 200)
pos: (50, 150)
background_color:
canvas.before:
Color:
rgba: self.background_color
Rectangle:
pos: self.pos
size: self.size
'''
Builder.load_string(kv)
class ColoredLabel(Label):
background_color = ListProperty((0,0,0,1))
class MyApp(App):
def build(self):
f = FloatLayout()
label = ColoredLabel(text="Hello World!", size_hint=(None, None), background_color=(random(), random(), random(), 1))
f.add_widget(label)
return f
if __name__ == "__main__":
MyApp().run()
在这种情况下改变里面的 posColoredLabel
实际上是有效果的。