在我正在制作的简单游戏中,我目前将占位符矩形对象作为图形。我试图用精灵替换它们,但据我所知,Tkinter不支持PNG或alpha透明度。我使用的是Python 3.3,它不能与PIL一起工作(因为它是一个学校项目,我只是试图使用Tkinter作为唯一的外部库)。有没有办法使用支持的文件格式的alpha通道,以便我可以有多层瓷砖?我只想过滤掉白色像素。
答案 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()
答案 1 :(得分:1)
要使白色像素透明(我假设白色意味着 #ffffff),您可以使用下面的此函数或类似的函数。这不需要 PIL。它对我适用于 png,但也适用于 gif。
以下是正在使用的函数的示例:
nextLine()
以下是白色背景的白色汽车示例:
这是使用示例程序在画布上的那辆车的示例:
所以我希望我已经回答了你的问题。
无论出于何种原因,使用上述函数多次处理透明度都会导致 tkinter 中的查看错误。下面是一种使用颜色切换功能去除多种颜色的方法: 这是一辆车:
这里还有一个颜色切换函数,可以在使颜色透明之前实现。
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
这是该过程的结果:
这里参考了一个类似的问题: How to rotate an image on a canvas without using PIL?
答案 2 :(得分:0)
有一种方法可以使用非官方版本的PIL在Python 3中使用PIL 转到http://www.lfd.uci.edu/~gohlke/pythonlibs/下载。