问题描述
当在Python中使用ImageTk.PhotoImage()
加载图片时,有时候可能会遇到图片不显示而没有报错的情况。这个问题可能是由于某些细节问题导致的。本篇攻略将会为大家讲解如何解决这种图片无法显示的问题。
解决方法
在解决这个问题的过程中,应该注意以下几个细节:
PhotoImage()
只能在全局范围内使用,不能在函数中调用。PhotoImage()
方法的文件所在的目录。mainloop()
将卡死程序,可使用update()
方法避免。下面我们通过两个示例来说明解决方法。
示例1:
# 示例1
from tkinter import *
from PIL import Image, ImageTk
root = Tk()
root.geometry('300x300')
img = Image.open('test.png')
photo = ImageTk.PhotoImage(img)
label = Label(root, image=photo)
label.image = photo # 防止图片被回收
label.pack()
root.mainloop()
这个示例中,我们采用了全局变量的方式加载图片。这是一种比较简单有效的方式。我们打开一个PNG
格式的图片,然后使用PhotoImage()
方法将其转换为TkInter
的图片。最后我们使用Label()
将图片展示出来。运行代码,我们可以看到图片成功显示在窗口中。
示例2:
# 示例2
from tkinter import *
from PIL import Image, ImageTk
root = Tk()
root.geometry('300x300')
def show_pic():
# 加载图片
img = Image.open('../images/test.png')
photo = ImageTk.PhotoImage(img)
# 窗口居中显示
x = (root.winfo_screenwidth() - root.winfo_reqwidth()) / 2
y = (root.winfo_screenheight() - root.winfo_reqheight()) / 2
root.geometry("+%d+%d" % (x, y))
# 创建标签,显示图片
label_img = Label(root, image=photo)
label_img.pack()
# 更新操作,否则会卡死程序
root.update()
show_pic()
root.mainloop()
这个示例中,我们将PhotoImage()
放在了函数中调用。根据前面提到的细节,这样做会导致图片无法正确显示。我们可以修改代码中的路径为相对于当前执行文件所在目录的路径,可以像这样实现 img = Image.open('images/test.png')
:
# 示例2修改后的代码
from tkinter import *
from PIL import Image, ImageTk
root = Tk()
root.geometry('300x300')
def show_pic():
# 加载图片
img = Image.open('./images/test.png')
photo = ImageTk.PhotoImage(img)
# 窗口居中显示
x = (root.winfo_screenwidth() - root.winfo_reqwidth()) / 2
y = (root.winfo_screenheight() - root.winfo_reqheight()) / 2
root.geometry("+%d+%d" % (x, y))
# 创建标签,显示图片
label_img = Label(root, image=photo)
label_img.pack()
# 更新操作,否则会卡死程序
root.update()
show_pic()
root.mainloop()
但是这个修改后的代码还有一个问题,就是当我们运行代码时,窗口出现后会卡主,无法响应我们的操作。因此我们需要在函数中插入 root.update()
来让程序正常运行。
总结:
以上就是解决python
中ImageTk.PhotoImage()
无法正确显示图片的完整攻略。我们需要注意图片路径问题,以及不能在函数中调用PhotoImage()
等细节问题。希望本篇攻略能帮助到大家,让大家更轻松愉快地开发Python
程序。
本文链接:http://task.lmcjl.com/news/6986.html