如何在Kivy中绘制占满整个Widget区域的垂直分割线?
Kivy 网格Widget垂直分割线实现方案
你代码存在两个核心问题:
- 初始化阶段Widget未完成布局,
self.size取到的是默认值而非实际渲染尺寸,且没有绑定尺寸变化事件,Widget大小改变时分割线不会自适应更新 Line的color参数不需要套ListProperty,ListProperty是用于声明类响应式属性的语法,不能直接作为参数传入绘制方法
正确实现代码
from kivy.uix.widget import Widget from kivy.graphics import Line SIZE = 2 class TestWidget(Widget): def __init__(self, **kwargs): super(TestWidget, self).__init__(**kwargs) # 绑定尺寸、位置变化事件,触发时更新分割线 self.bind(size=self.update_grid_lines, pos=self.update_grid_lines) # 初始化时先绘制一次 self.update_grid_lines() def update_grid_lines(self, *args): # 清空之前的画布内容,避免重复绘制叠加 self.canvas.clear() with self.canvas: # 绘制垂直分割线,从1开始避免边缘重复画线 for i in range(1, SIZE): x_pos = self.width * (i / SIZE) Line(points=[x_pos, self.y, x_pos, self.y + self.height], color=(0, 0, 1, 1))
补充说明
- 如果需要连Widget左右边缘也绘制分割线,把
range(1, SIZE)改为range(SIZE + 1)即可 - 若要添加水平分割线,参考垂直分割线的逻辑,在
update_grid_lines的with canvas代码块中添加如下代码即可:
for i in range(1, SIZE): y_pos = self.height * (i / SIZE) Line(points=[self.x, y_pos, self.x + self.width, y_pos], color=(0,0,1,1))
内容的提问来源于stack exchange,提问作者Adam Kalinowski
相关产品推荐
相关产品推荐

