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
相关产品推荐
相关产品推荐

