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

