我正在尝试在Tkinter窗口中显示图像,对于某些图像,Tkinter会将它们弄乱了。我注意到,它仅发生在单色图像上,除了灰色阴影之外,没有任何颜色的图像。
上部图像(月亮)显示不正确,而下部图像(月亮)没有显示。这是在MS Paint(左)和Win10(右)的Photo Viewer中查看的图像。
我不确定是什么原因导致此问题,因为我看不到图像中的错误。
由于我是从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分支(据我了解,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()