如何在Tkinter Canvas中绘制开放多边形?
解决方案
因为create_polygon本身就是用来绘制闭合多边形的,要实现“先画非闭合轨迹、双击闭合”的需求,你可以这么做:
- 用
create_line实时展示未闭合的绘制路径:用户每点击一次就添加一个顶点,同时更新这条线的坐标,这样就能看到未闭合的轨迹。 - 维护一个顶点列表:记录用户所有点击的坐标点,方便后续生成多边形。
- 双击时生成闭合多边形:触发双击事件后,用保存的顶点列表调用
create_polygon,同时可开启平滑效果。
示例代码
import tkinter as tk class PolygonDrawer: def __init__(self, root): self.root = root self.canvas = tk.Canvas(root, width=600, height=400, bg="white") self.canvas.pack() self.vertices = [] self.temp_line = None # 绑定事件:左键点击添加顶点,双击闭合多边形 self.canvas.bind("<Button-1>", self.add_vertex) self.canvas.bind("<Double-Button-1>", self.close_polygon) def add_vertex(self, event): # 添加新顶点到列表 self.vertices.append((event.x, event.y)) # 如果已有至少两个顶点,更新临时线条 if len(self.vertices) >= 2: if self.temp_line: self.canvas.delete(self.temp_line) # 用create_line画非闭合路径 self.temp_line = self.canvas.create_line(self.vertices, fill="blue", width=2) def close_polygon(self, event): if len(self.vertices) < 3: return # 至少需要3个顶点才能构成多边形 # 生成闭合的平滑多边形 self.canvas.create_polygon( self.vertices, fill="lightblue", outline="darkblue", width=2, smooth=True # 开启内置平滑 ) # 清除临时线条和顶点列表,准备下一次绘制 if self.temp_line: self.canvas.delete(self.temp_line) self.vertices = [] self.temp_line = None if __name__ == "__main__": root = tk.Tk() root.title("Polygon Drawer") drawer = PolygonDrawer(root) root.mainloop()
额外说明
- 如果需要更自定义的平滑效果,可以手动对顶点进行插值处理(比如计算相邻顶点的中点,或者贝塞尔曲线控制点),再把处理后的顶点传给
create_polygon。 - 可以根据需求调整线条颜色、填充色、宽度等参数。
内容的提问来源于stack exchange,提问作者Mike Azatov
相关产品推荐
相关产品推荐

