关键词

python中ImageTk.PhotoImage()不显示图片却不报错问题解决

问题描述
当在Python中使用ImageTk.PhotoImage()加载图片时,有时候可能会遇到图片不显示而没有报错的情况。这个问题可能是由于某些细节问题导致的。本篇攻略将会为大家讲解如何解决这种图片无法显示的问题。

解决方法
在解决这个问题的过程中,应该注意以下几个细节:

  1. PhotoImage()只能在全局范围内使用,不能在函数中调用。
  2. 加载图片使用相对路径时,应该注意相对路径的基准位置是当前执行文件所在的目录,而非调用PhotoImage()方法的文件所在的目录。
  3. 在等待窗口中使用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() 来让程序正常运行。

总结:
以上就是解决pythonImageTk.PhotoImage()无法正确显示图片的完整攻略。我们需要注意图片路径问题,以及不能在函数中调用PhotoImage()等细节问题。希望本篇攻略能帮助到大家,让大家更轻松愉快地开发Python程序。

本文链接:http://task.lmcjl.com/news/6986.html

展开阅读全文