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

Pycairo无法绘制路径求助:MIDI转SVG绘图项目异常排查

问题排查与修复方案

1. 最直接的错误:未执行绘制方法

你的代码里 context.stroke 少了括号,这是方法调用,必须加括号才会触发绘制动作:

# 错误写法
context.stroke
# 正确写法
context.stroke()

2. 重复创建Surface导致内容被覆盖

每次调用drawLine都会新建一个SVGSurface并写入同一个文件,这会直接覆盖之前的所有绘制内容。正确的做法是只初始化一次Surface和Context,所有绘制完成后再结束Surface:

# 初始化Surface和Context(放在drawLine函数外,仅执行一次)
surface = cairo.SVGSurface(f"/Users/chrishedden/globalData/midi_svgs/midi_{i}.svg", width, height)
context = cairo.Context(surface)
context.scale(width, height)

def drawLine(params):
    moveTo_X = params["moveTo_X"]
    moveTo_Y = params["moveTo_Y"]
    pointX, pointY = pointXY(params)

    context.move_to(moveTo_X, moveTo_Y)
    context.line_to(pointX + offset, pointY + offset)
    print(str(pointX + offset) + ' ' + str(pointY + offset))
    context.stroke()  # 修复括号问题

# 所有路径绘制完成后,再结束Surface
surface.finish()

3. 额外检查点

  • 确认width、height、offset、i这些变量都有合理的定义值,比如width和height不能为0,offset不要让计算后的坐标超出0-1范围(因为context.scale(width, height)将画布坐标归一化到了[0,1]区间,超出部分会被裁剪)
  • 检查pointXY(params)返回的坐标是否符合预期,打印出来的坐标值要确保落在画布范围内

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 00:50:22