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

