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

Kivy中自定义Label的canvas.before仅作用于最后一个添加控件问题咨询

问题原因
  • 你仅在控件初始化方法__init__中给RoundedRectangle一次性赋值了初始的pos和size,但Kivy框架中控件刚实例化时还没有完成布局计算,初始位置、尺寸都是默认值,后续布局管理器调整所有控件的位置和尺寸时,你绘制的圆角矩形属性没有跟随控件本身同步更新。
  • 所有旧控件的背景都被绘制在了错误的初始位置(通常是屏幕左下角),只有最后一个添加的控件的背景刚好停留在最终渲染的正确位置,因此会出现“仅最后一个控件有绘制效果”的错觉。
修复方案

给控件的pos、size属性添加绑定回调,只要控件自身的位置、尺寸发生变化,就同步更新背景圆角矩形的对应属性,修改后的代码如下:

class text_opponent(Label):
    def __init__(self,tx,**kwargs):
        super(text_opponent,self).__init__(**kwargs)
        self.text = tx
        with self.canvas.before:
            Color(151/255,154/255,170/255,.8)
            self.rect = RoundedRectangle(pos=self.pos,size=self.size,radius=[(20, 20), (20, 20), (20, 20), (20, 20)])
        # 新增属性绑定,位置或尺寸变化时触发更新
        self.bind(pos=self.update_rect, size=self.update_rect)
    
    def update_rect(self, *args):
        # 同步背景的位置和尺寸为控件当前值
        self.rect.pos = self.pos
        self.rect.size = self.size

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 04:57:03