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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 15:02:18