Tkinter PhotoImage的透明度

时间:2013-04-14 21:17:46

标签: python tkinter

在我正在制作的简单游戏中,我目前将占位符矩形对象作为图形。我试图用精灵替换它们,但据我所知,Tkinter不支持PNG或alpha透明度。我使用的是Python 3.3,它不能与PIL一起工作(因为它是一个学校项目,我只是试图使用Tkinter作为唯一的外部库)。有没有办法使用支持的文件格式的alpha通道,以便我可以有多层瓷砖?我只想过滤掉白色像素。

3 个答案:

答案 0 :(得分:1)

我能够使用具有透明度的图像。我理解您希望避免使用PIL,但以下代码有效并证明Tkinter将支持具有透明度的格式。

    from Tkinter import Tk, Canvas
    import PIL
    root = Tk() 
    tkimg = PIL.ImageTk.PhotoImage('cat1-a.gif')
    canvas = Canvas(root, height=600, width=600)
    canvas.grid()
    def stamp(event):
        canvas.create_image(event.x, event.y, image=tkimg)
    canvas.bind('<ButtonPress-1>', stamp)
    root.mainloop()

three create_image() calls demonstrate transparency

答案 1 :(得分:1)

要使白色像素透明(我假设白色意味着 #ffffff),您可以使用下面的此函数或类似的函数。这不需要 PIL。它对我适用于 png,但也适用于 gif。

  • 首先,制作一张与图像大小相同的新空白图像。
  • 其次,逐个像素地将像素复制到新图像(除非像素为白色)。
  • 将您的原始图像设置为新图像。

以下是正在使用的函数的示例:

nextLine()

以下是白色背景的白色汽车示例:

car with white background

这是使用示例程序在画布上的那辆车的示例:

car on canvas with orange background

所以我希望我已经回答了你的问题。

  • 我没有使用 PIL。除了 tkinter 模块什么都没有。
  • 我只用了 gif,而不是你问的 png。
  • 无论白色在哪里,现在都将是透明的。

注意:

无论出于何种原因,使用上述函数多次处理透明度都会导致 tkinter 中的查看错误。下面是一种使用颜色切换功能去除多种颜色的方法: 这是一辆车:

red car with grey background

这里还有一个颜色切换函数,可以在使颜色透明之前实现。

from tkinter import *


def makeTransparent(img, colorToMakeTransparentInHexFormat):
    newPhotoImage = PhotoImage(width=img.width(), height=img.height())
    for x in range(img.width()):
        for y in range(img.height()):
            rgb = '#%02x%02x%02x' % img.get(x, y)
            if rgb != colorToMakeTransparentInHexFormat:
                newPhotoImage.put(rgb, (x, y))
    return newPhotoImage


root = Tk()
mycanvas = Canvas(root, width=200, height=200,bg="orange")
mycanvas.pack()

myphotoImage = PhotoImage(file="whitecar.gif")
#set your image to the image returned by the function
myphotoImage = makeTransparent(myphotoImage, "#ffffff")
canvasImage = mycanvas.create_image(100, 100, image=myphotoImage, anchor=CENTER)

root.mainloop()

这里正在使用

def switchColors(img, currentColor,futureColor):
    newPhotoImage = PhotoImage(width=img.width(), height=img.height())
    for x in range(img.width()):
        for y in range(img.height()):
            rgb = '#%02x%02x%02x' % img.get(x, y)
            if rgb == currentColor:
                newPhotoImage.put(futureColor, (x, y))
            else:
                newPhotoImage.put(rgb, (x, y))
    return newPhotoImage

这是该过程的结果:

car with 2 greys and red removed

这里参考了一个类似的问题: How to rotate an image on a canvas without using PIL?

答案 2 :(得分:0)

有一种方法可以使用非官方版本的PIL在Python 3中使用PIL 转到http://www.lfd.uci.edu/~gohlke/pythonlibs/下载。