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

如何为tk.Canvas的扇形填充渐变色彩而非纯色?

实现tkinter扇形的渐变填充

可以实现,但tkinter自带的Canvas组件没法直接给扇形加渐变填充,得借助Pillow库生成带渐变的图像,再放到Canvas上显示。

首先安装依赖:

pip install pillow

径向渐变扇形

径向渐变是从中心向外围过渡颜色(比如中心黄色、边缘蓝色),代码实现如下:

import tkinter as tk
from PIL import Image, ImageDraw, ImageTk

root = tk.Tk()
canvas = tk.Canvas(root, width=200, height=200)
canvas.grid(row=0, column=0, sticky="nsew", pady=10)

# 生成径向渐变图像
size = (200, 200)
img = Image.new("RGBA", size, (0, 0, 0, 0))
draw = ImageDraw.Draw(img)
center = (100, 100)
radius = 100

# 从中心到边缘绘制渐变同心圆
for i in range(radius, 0, -1):
    ratio = (radius - i) / radius
    # 黄色向蓝色过渡
    r = int(255 * (1 - ratio))
    g = int(255 * (1 - ratio))
    b = int(255 * ratio)
    draw.ellipse(
        (center[0]-i, center[1]-i, center[0]+i, center[1]+i),
        fill=(r, g, b)
    )

# 生成扇形遮罩(适配非完整圆形的扇形)
mask = Image.new("L", size, 0)
mask_draw = ImageDraw.Draw(mask)
mask_draw.pieslice((0, 0, 200, 200), start=0, extent=359, fill=255)
img.putalpha(mask)

# 转换为tkinter可用的图像并显示
tk_img = ImageTk.PhotoImage(img)
canvas.create_image(100, 100, image=tk_img)
# 添加蓝色边框
canvas.create_arc(10, 10, 200, 200, style=tk.PIESLICE, start=0, extent=359, fill="", outline="blue", width=10)

root.mainloop()

角度渐变扇形

角度渐变是沿圆周角度过渡颜色(比如0度黄色、360度蓝色),代码实现如下:

import tkinter as tk
from PIL import Image, ImageDraw, ImageTk

root = tk.Tk()
canvas = tk.Canvas(root, width=200, height=200)
canvas.grid(row=0, column=0, sticky="nsew", pady=10)

size = (200, 200)
img = Image.new("RGBA", size, (0, 0, 0, 0))
draw = ImageDraw.Draw(img)
center = (100, 100)
radius = 100

# 按小角度分段绘制渐变扇形
step = 1  # 每1度绘制一段,值越小过渡越平滑
for angle in range(0, 359, step):
    ratio = angle / 359
    # 黄色向蓝色过渡
    r = int(255 * (1 - ratio))
    g = int(255 * (1 - ratio))
    b = int(255 * ratio)
    draw.pieslice(
        (center[0]-radius, center[1]-radius, center[0]+radius, center[1]+radius),
        start=angle,
        extent=step,
        fill=(r, g, b)
    )

# 转换为tkinter图像并显示
tk_img = ImageTk.PhotoImage(img)
canvas.create_image(100, 100, image=tk_img)
# 添加蓝色边框
canvas.create_arc(10, 10, 200, 200, style=tk.PIESLICE, start=0, extent=359, fill="", outline="blue", width=10)

root.mainloop()

补充说明

  • 如果需要非完整圆形的扇形,只需要调整extent参数,遮罩会自动裁剪出对应区域。
  • 边框是通过单独调用create_arc实现的,保证边框样式和原需求一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 06:20:27