Если вы хотите динамически изменить цвет или размер холста,
Я рекомендую использовать Kivy Properties для него.
Вот код.
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
, что упрощает обращение к переменной из кода Python с помощью root.variable_name
.
Если вы хотите изменить фон холста, вы также можете изменить код KIVY.
canvas:
Color:
rgb: root.canvas_color
Rectangle:
pos: self.pos
size: self.size
source: root.image_path
таким образом, вы можете импортировать StringProperty
из kivy.properties
и применять то же самое.При изменении значения 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
таким образом.