【问题标题】:How to make a tkinter canvas rectangle transparent?如何使 tkinter 画布矩形透明?
【发布时间】:2019-07-05 08:59:22
【问题描述】:

我需要让我的 tkinter 矩形透明。有人知道怎么做吗?

我尝试指定alpha=".5", opacity=".5",并尝试在颜色代码末尾添加两位数字:fill="#ff000066"。这些东西似乎都不起作用,我找不到正确的语法。

import tkinter

root = tkinter.Tk()
canvas = tkinter.Canvas(root, width=800, height=600)
canvas.pack()

canvas.create_rectangle(50, 50, 100, 100, fill="#ff0000", alpha=0.5)

root.mainloop()

这段代码给了我这个消息:_tkinter.TclError: unknown option "-alpha",所以这显然不是正确的做法。

【问题讨论】:

  • 如果我错了,请见谅,但 IIRC tkinter 支持四种颜色格式:#rgb#rgba#rrggbb#rrggbbaa。当您尝试fill="#ff000080" 时会发生什么? (我很确定这对 HTML/CSS 有效,不确定对 tk)。
  • 好像不支持#rrggbbaa。尝试你所说的会给我这个错误:_tkinter.TclError: invalid color name "#ff000080"
  • 不是语法问题。 tkinter 不支持 Canvas 上项目的透明度。有一些方法可以使整个顶级窗口透明,但是对于低于该级别的单个小部件(包括 Canvas 对象),没有任何东西可以控制它。
  • 尝试添加stipple='gray50',但这不是真正的透明。

标签: python tkinter colors transparency


【解决方案1】:

您可以使用透明图像来模拟结果。使用Pillow 创建透明图像,然后使用canvas.create_image(...) 绘制它。下面是一个示例代码:

from tkinter import *
from PIL import Image, ImageTk

root = Tk()

images = []  # to hold the newly created image

def create_rectangle(x1, y1, x2, y2, **kwargs):
    if 'alpha' in kwargs:
        alpha = int(kwargs.pop('alpha') * 255)
        fill = kwargs.pop('fill')
        fill = root.winfo_rgb(fill) + (alpha,)
        image = Image.new('RGBA', (x2-x1, y2-y1), fill)
        images.append(ImageTk.PhotoImage(image))
        canvas.create_image(x1, y1, image=images[-1], anchor='nw')
    canvas.create_rectangle(x1, y1, x2, y2, **kwargs)

canvas = Canvas(width=300, height=200)
canvas.pack()

create_rectangle(10, 10, 200, 100, fill='blue')
create_rectangle(50, 50, 250, 150, fill='green', alpha=.5)
create_rectangle(80, 80, 150, 120, fill='#800000', alpha=.8)

root.mainloop()

还有输出:

【讨论】:

  • 你需要安装Pillow模块。
  • @acw1668 无论我在我的应用程序中尝试什么,图像始终是白色的。你以前有没有这样面对过smt?
  • @Alper91 您是否保存了ImageTk.PhotoImage() 实例的引用?
  • @acw1668 是的,问题出在 'Image.new('RGBA', (x2-x1, y2-y1), fill)' Iencode colors in Hex: #0101FF ->它应该将其解码为 1,1,255,但它是魔鬼:257、65332、21122。我自己解码:(int(color[1:3],16),int(color[3:5],16),int(color [5:7],16),55) 现在可以了。不过还是谢谢。
  • winfo_rgb() 返回的颜色分量值在 0-65535 的范围内,但是 Pillow 中的 RGB 颜色分量是 8 位的,范围是 0-255。所以这段代码传递了(0, 32896, 0, 127)(32896, 0, 0, 204) 的填充颜色。它似乎有效,所以枕头在它收到的值上做一个(未记录的)% 256
【解决方案2】:

在画布中,如果您希望某些小部件是透明的,只需让填充参数为空即可:

fill=""

【讨论】:

    猜你喜欢
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    相关资源
    最近更新 更多