Tkinter:将具有透明背景的图像添加到按钮

Posted

技术标签:

【中文标题】Tkinter:将具有透明背景的图像添加到按钮【英文标题】:Tkinter: Adding Image with transparent background to Button 【发布时间】:2020-12-09 04:23:16 【问题描述】:

希望你们一切都好。我有一个问题希望你能帮忙解决。

我正在尝试在 tkinter 中构建棋盘游戏。这将有不同形状的瓷砖放置在背景图像顶部的正方形中。我已经设法使用 tk.PhotoImage 和 tk.Label 在背景中添加,并使用 ImageTk.PhotoImage 正确调整了图块的图像大小。

但是,当我将瓷砖放在板上时,所有透明度都会丢失并被单调灰色代替。

最小代码:

from PIL import Image,ImageTk
import tkinter as tk

def tile_push():
    pass

# Create background image
root = tk.Tk()
root.geometry("390x500") # Size of background board
background_image = tk.PhotoImage(file="Gameboard.png")
background_label = tk.Label(root, image=background_image)
background_label.place(x=0, y=0, relwidth=1, relheight=1)

# Create button
im = Image.open("Chick.png").resize((100,100))
image_player_1 = ImageTk.PhotoImage(im)
b = tk.Button(root, image=image_player_1, command=tile_push, borderwidth=0, highlightthickness=0)
b.place(x=140, y=258, width=115, height=115)
tk.mainloop()

关于 SO 的类似问题显示了如何将背景设置为黑色,但我需要背景是透明的。

任何帮助将不胜感激!

【问题讨论】:

AFAIK,tkinter 不支持小部件级别的透明度。唯一的例外是能够使整个窗口(及其所有内容)透明。 您可以使用CanvasCanvas.create_image() 显示透明图像。也可以使用Canvas.tag_bind()函数绑定图片点击时的回调。 【参考方案1】:

感谢 acw 的支持,我现在已经成功了。这就是我所做的:

from PIL import Image,ImageTk
import tkinter as tk

def tile_push(*args, **kwargs):
    print("It's alive!")

# Create background image
root = tk.Tk()
root.geometry("390x500") # Size of background board
canvas = tk.Canvas(root, width=390, height=500)
canvas.place(x=0,y=0)
background_image = tk.PhotoImage(file="Gameboard.png")
canvas.create_image((0,0), anchor="nw", image=background_image)

# Create button
im = Image.open("Chick.png").resize((115,115))
imTk =  ImageTk.PhotoImage(im)
chick = canvas.create_image((140,258), anchor="nw", image=imTk)
canvas.tag_bind(chick, '<Button-1>', tile_push)
tk.mainloop()

【讨论】:

以上是关于Tkinter:将具有透明背景的图像添加到按钮的主要内容,如果未能解决你的问题,请参考以下文章

具有颜色和背景图像的按钮

使用 imagecopymerge 添加时具有透明背景的图像变为白色

使用 WinAPI 创建具有透明背景的文本标签

将具有透明背景的图像上传到 azure blob 显示具有黑色背景的图像

Tkinter:模糊的透明背景帧

带有透明文本的 Android 按钮