如果你愿意动态改变画布的颜色或大小,
我建议使用 Kivy 属性。
这里是代码。
from kivy.properties import ListProperty
from kivy.lang import Builder
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
class RootLayout(BoxLayout):
canvas_color = ListProperty([0, 1, 1])
class canvasCallApp(App):
def build(self):
return kv
kv = Builder.load_string('''
RootLayout:
id: left_box
canvas:
Color:
rgb: root.canvas_color
Rectangle:
pos: self.pos
size: self.size
Widget:
size_hint_x: None
width: left_box.width - right_box.width
BoxLayout:
width: 200
id: right_box
Button:
text: 'I ma a button'
''')
if __name__ == '__main__':
canvasCallApp().run()
我还建议使用RootLayout,这样可以更轻松地通过root.variable_name 从 python 代码中引用变量。
如果要改变canvas的背景,也可以将kivy代码改为
canvas:
Color:
rgb: root.canvas_color
Rectangle:
pos: self.pos
size: self.size
source: root.image_path
这样,您可以从kivy.properties 导入StringProperty 并应用相同的东西。随着image_path的值变化,背景会自动变化。
如果您想直接访问画布以重绘画布,可以使用with canvas
from kivy.uix.boxlayout import BoxLayout
from kivy.graphics import Rectangle, Color
class SomeBoxLayout(BoxLayout)
def __init__(self, **kwargs):
super(SomeBoxLayout, self).__init__(**kwargs)
with self.canvas:
Color(1, 0, 0, 1) # set the color to red
self.rect = Rectangle(pos=self.center,
size=(self.width/2.,
self.height/2.))
def redraw(self):
self.canvas.clear()
with self.canvas:
Color(0, 0, 1, 1) # set the color to blue
self.rect = Rectangle(pos=self.center,
size=(self.width/2.,
self.height/2.))
请注意,您应该在再次绘制之前执行canvas.clear()。
另外,您可以通过这种方式使用with self.canvas.before 或with self.canvas.after。