我正在尝试在Tkinter窗口中显示图像,对于某些图像,Tkinter会将它们弄乱了。我注意到,它仅发生在单色图像上,除了灰色阴影之外,没有任何颜色的图像。



上部图像(月亮)显示不正确,而下部图像(月亮)没有显示。这是在MS Paint(左)和Win10(右)的Photo Viewer中查看的图像。
 

我不确定是什么原因导致此问题,因为我看不到图像中的错误。

由于我是从Yahoo Weather那里获取的,因此这里是a link to the "faulty" moon imagea 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分支(据我了解,PIL仅适用于Python 2):Pillow

你能帮我解决这个问题吗?

最佳答案

您的示例显示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()

10-07 19:24
查看更多