我正在尝试在Tkinter窗口中显示图像,对于某些图像,Tkinter显示它们搞砸了。我注意到它只发生在单色图像上,除了灰色阴影外没有任何颜色的图像。
上图(月亮)显示不正确,而下图(雨)则不正确。这是在MS Paint(左)和Win10上的照片查看器(右)中查看的图像。
我不确定是什么导致了这个问题,因为我看不到图像中的错误。
自从我从Yahoo Weather获取它们之后,这里是a link to the "faulty" moon image,而这里是a link to the "correct" rain image。
最后,这是我的代码:
import tkinter
from PIL import Image, ImageTk
window = tkinter.Tk()
# This part doesn't work as intended
display = ImageTk.PhotoImage(Image.open('moon.png'))
label = tkinter.Label(window, image=display)
label.pack()
# This part does
display2 = ImageTk.PhotoImage(Image.open('rain.png'))
label2 = tkinter.Label(window, image=display2)
label2.pack()
window.mainloop()
注意:我正在使用PIL fork (据我所知,PIL仅适用于Python 2):Pillow
你能帮我搞清楚吗?
答案 0 :(得分:2)
您的示例显示ImageTk
无法正常处理灰度图像。但至少有两种解决方法可以正确显示图片。
首先不要使用ImageTk
。实际上,自Tk 8.6起,PhotoImage
可以加载PNG图像:
import tkinter
window = tkinter.Tk()
display = tkinter.PhotoImage(file='moon.png')
label = tkinter.Label(window, image=display)
label.pack()
window.mainloop()
但如果您绝对需要使用ImageTk
,则可以将图片模式更改为RGBA:
import tkinter
from PIL import Image, ImageTk
window = tkinter.Tk()
moon = Image.open('moon.png')
moon.mode = 'RGBA' # force mode to RGBA
display = ImageTk.PhotoImage(moon)
label = tkinter.Label(window, image=display)
label.pack()
window.mainloop()