【问题标题】:Transparent Backgrounds on Buttons in TkinterTkinter 中按钮上的透明背景
【发布时间】:2015-04-24 21:24:30
【问题描述】:

我有一个带有按钮图像的Button,但是当它在我的窗口中时,按钮的背景与窗口的背景发生冲突。这是一个 .png 图像,但tkinter 似乎想通过添加灰色空间来将图像保持为四边形。有没有办法让按钮的空白区域变得透明,这样你就只剩下按钮图像了?

我在 Windows 8 上使用 Python 3.4.2。

【问题讨论】:

  • 这很可能是.png 图像问题。先试试改成.gif(支持透明背景),不行的话告诉我。
  • PNG 支持透明背景,从PIL 导入到tkinter.png 保持透明度。
  • 不,我已将文件更改为 gif,但同样的事情正在发生。
  • 我找到了一个半有用的页面。它概述了如何在标签上制作透明背景,但不幸的是,此方法不适用于按钮。这是链接:stackoverflow.com/questions/19080499/…
  • 我认为问题可能在于,虽然图像是透明的,但 Button 本身不是,所以你看到的灰色是图像后面的 Button

标签: python button background tkinter


【解决方案1】:

要创建支持.png 透明度的图像,您必须创建一个Canvas,然后使用画布.create_image() 功能创建一个图像对象。然后使用.tag_bind()将事件绑定到画布图像。

例如:

import tkinter as tk
from PIL import Image, ImageTk

def quitGame(event):
    window.destroy()

window = tk.Tk()
window.geometry("500x500")

canvas = tk.Canvas(window, width = 300, height = 300)
canvas.pack()

#creating background
bgImage = ImageTk.PhotoImage(Image.open("Images/background.png")) 
bg = canvas.create_image(0, 0, image=bgImage, anchor=tk.NW)

#creating button which supports png transparency
quitImage = ImageTk.PhotoImage(Image.open("Images/quitImage.png"))
quitButton = canvas.create_image(50, 50, image=quitImage)
canvas.tag_bind(quitButton, "<Button-1>", quitGame)

window.mainloop()

【讨论】:

  • 确实没有必要使用 PIL 来执行此操作,因为 tkinter.PhotoImage 可以读取 .png 以及 .gif.pgm.ppm 格式的文件。请参阅my answer 的相关帖子,该帖子说明了这一点(但其他方面基于您的)。
【解决方案2】:

解决方案有点棘手,因为您需要使用 PIL 来解决问题,但可以。战斗2小时后才解决。

您需要使用 PIL 作为图像加载器,然后将图像传递给 tkinter,但使用根(主 tk.Tk() 类对象) - 否则图像将不可见,因为它已经在垃圾中消失了收藏家,只剩下图像的空间。简化代码如下:

import tkinter as tk
from PIL import Image, ImageTk

root = tk.Tk()

button = tk.Button(self.left_menu)
button_load = Image.open('assets/search.png')
root.button_img = ImageTk.PhotoImage(button_load)
button.config(image=root.button_img)

button_1.pack(side='top')

【讨论】:

  • 我不认为这是解决 OP 的问题根本
【解决方案3】:

如果您使用带有import PIL 的 .png,python 支持透明度。

但是,在tkinter 中,.Button 小部件不支持透明度。

因此,您将拥有纯色背景之上的透明图像。

如果您是 Windows 用户,最好的选择是这个解决方案:

Transparent background in a Tkinter window

【讨论】:

    猜你喜欢
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 2022-01-24
    相关资源
    最近更新 更多