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

如何在Tkinter Canvas中擦除多边形内部的指定区域?

如何在Tkinter中绘制带孔洞的填充多边形

当然可以实现这个需求!不过Tkinter的create_polygon方法本身并没有直接提供“带孔洞多边形”的绘制选项,但我们可以通过两种实用技巧来达成目标:

方法1:利用奇偶填充规则绘制复合路径

这是更优雅的解决方案,核心是利用Tkinter画布的奇偶缠绕填充规则——当绘制的路径交叉次数为奇数时填充区域,偶数时则不填充。具体操作是把外层多边形和内层孔洞多边形的顶点按相反顺序(比如外层顺时针,内层逆时针)合并成一个顶点列表,再用create_polygon绘制即可自动形成孔洞。

举个实际代码例子:

import tkinter as tk

root = tk.Tk()
canvas = tk.Canvas(root, width=400, height=400, bg="white")
canvas.pack()

# 外层大矩形顶点(顺时针顺序)
outer_vertices = [50, 50, 350, 50, 350, 350, 50, 350]
# 内层小矩形顶点(逆时针顺序,和外层相反)
inner_vertices = [150, 150, 150, 250, 250, 250, 250, 150]

# 合并两个多边形的顶点列表
combined_vertices = outer_vertices + inner_vertices

# 绘制带孔洞的多边形,设置填充色和边框色
canvas.create_polygon(combined_vertices, fill="lightblue", outline="black", width=2)

root.mainloop()

注意:内外层顶点的顺序一定要相反,否则填充规则会失效,反而会把两个区域都填上颜色。

方法2:用背景色覆盖内层区域

如果你的画布背景是纯色,这种方法更简单直接:先绘制外层填充好的多边形,再用画布的背景色(或者你想要的孔洞显示颜色)绘制内层的小多边形,直接覆盖掉中间的填充区域。

代码示例:

import tkinter as tk

root = tk.Tk()
canvas = tk.Canvas(root, width=400, height=400, bg="white")
canvas.pack()

# 第一步:绘制外层填充多边形
canvas.create_polygon([50, 50, 350, 50, 350, 350, 50, 350], fill="lightblue", outline="black", width=2)
# 第二步:用画布背景色绘制内层多边形,实现“挖洞”效果
canvas.create_polygon([150, 150, 250, 150, 250, 250, 150, 250], fill="white", outline="black", width=2)

root.mainloop()

这种方法的缺点是:如果画布背景不是纯色,或者内层区域下方有其他绘制元素,覆盖操作会把这些元素也遮挡住,所以只适合背景单一的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:14:41