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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 15:57:04