在tkinter Canvas上绘制粗曲线出现显示瑕疵如何解决
问题根源
你当前的实现逻辑是每次鼠标拖动事件触发时,都创建独立的短线段对象。joinstyle、smooth等参数仅对同一个线段对象内部的多个节点生效,无法作用于多个独立线段的衔接处,因此粗线宽下会出现明显的衔接缺口。
可行解决方案
采用「单次按下创建单个线段对象,拖动时更新线段坐标」的逻辑,所有绘制路径属于同一个线段对象,天然可以通过线段自带的参数优化衔接效果。
修改后完整代码
from tkinter import * from tkinter import ttk class Sketchpad(Canvas): def __init__(self, parent, **kwargs): super().__init__(parent, **kwargs) self.bind("<Button-1>", self.start_draw) self.bind("<B1-Motion>", self.update_draw) self.current_line = None self.points = [] def start_draw(self, event): # 按下鼠标时初始化当前线段的坐标列表,创建线段对象 self.points = [event.x, event.y] # 可以在这里统一指定线宽、圆角衔接、平滑等参数 self.current_line = self.create_line( self.points, width=20, capstyle=ROUND, joinstyle=ROUND, smooth=True ) def update_draw(self, event): # 拖动时仅更新当前线段的坐标列表,不新建线段 self.points.extend([event.x, event.y]) self.coords(self.current_line, *self.points) root = Tk() root.columnconfigure(0, weight=1) root.rowconfigure(0, weight=1) sketch = Sketchpad(root) sketch.grid(column=0, row=0, sticky=(N, W, E, S)) root.mainloop()
效果说明
- 同一段连续绘制的路径属于同一个线段对象,
joinstyle=ROUND和smooth=True参数会对整段路径生效,完全消除粗线宽下的衔接缺口 - 你可以根据需求调整
width、smooth、capstyle等参数,都可以正常生效
内容的提问来源于stack exchange,提问作者maroba
相关产品推荐
相关产品推荐

