You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python3 Kivy中修改已绘制矩形的颜色?

解决Kivy中Canvas矩形颜色动态修改问题

要修改现有矩形rect1的颜色而不创建新实例,核心是保存该矩形对应的Color指令引用,直接修改其颜色属性即可。具体步骤如下:

  1. 保存Color指令引用:在初始化rect1前,将对应的Color指令赋值给实例变量,后续可直接修改它的颜色值。
  2. 动态修改颜色:在on_touch_down方法中,直接修改该Color实例的rgb属性。

修改后的完整代码:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Rectangle, Color


class CanvasWidget(Widget):

    def __init__(self, **kwargs):
        super(CanvasWidget, self).__init__(**kwargs)
        self.click_occured = False
        with self.canvas:
            Color(0, 1, 0)
            self.background = Rectangle(pos=self.pos, size=self.size)
            # 保存rect1对应的Color指令引用
            self.rect1_color = Color(1, 1, 1)
            self.rect1 = Rectangle(pos=self.pos, size=(self.width/2, self.height/2))
            Color(0, 0, 1)
            self.rect2 = Rectangle(pos=self.pos, size=(self.width/4, self.height/4))
            self.bind(pos = self.update_rect, size = self.update_rect)

    def update_rect(self, *args):
        self.background.pos = self.pos
        self.background.size = self.size
        if not self.click_occured:
            self.rect1.pos = self.pos
        else:
            self.rect1.pos = self.x + self.width/8, self.y + self.height/8
        self.rect1.size = (self.width/2, self.height/2)
        self.rect2.pos = self.pos
        self.rect2.size = (self.width/4, self.height/4)

    def on_touch_down(self, touch):
        self.click_occured = True
        self.rect1.pos = self.x + self.width/8, self.y + self.height/8
        # 修改rect1的颜色为红色
        self.rect1_color.rgb = (1, 0, 0)


class CanvasApp(App):
    def build(self):
        return CanvasWidget()
CanvasApp().run()

原理说明

Kivy的Canvas指令按顺序执行,Color指令会影响后续所有图形绘制,直到遇到下一个Color指令。通过保存rect1对应的Color实例引用,修改其颜色属性时,会直接更新该矩形的显示颜色,同时不会影响rect2(因为rect2有独立的Color指令在rect1之后),也不需要重绘任何元素,完全符合需求。

内容的提问来源于stack exchange,提问作者Dmitry Volovich

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 05:42:45