我正在学习tkinter模块,我遇到了一个问题。我做了一个函数来显示文件夹中的图像但我的图像不会显示但窗口的分辨率和我的图像一样。谁有解决办法?
from tkinter import *
from PIL import ImageTk, Image
root = Tk()
def my_image(img, row, column) :
pic = ImageTk.PhotoImage(Image.open("C:/Users/Mark/Downloads/test/" + img))
my_img = Label(image=pic)
return my_img.grid(row=row, column=column)
# Create image
image1 = my_image("luigi_icon.png", 0, 1)
root.mainloop()
这个问题在Stackoverflow上出现过很多次。
在PhotoImage
中有bug
,当它被赋值给局部变量时从内存中删除图像。你必须把它赋值给全局变量或者某个对象
通常的解决方案是将pic
分配给显示它的label
。
my_img.pic = pic
见Note
在页末PhotoImage
(它是Wayback Machine
上的存档版本,因为原始版本已被删除)
顺便说一句:
你有其他问题。grid()
得到None
。如果您想稍后访问标签,则应该返回my_img
。
目前原来的tk.PhotoImage
可以与png
一起工作,所以你不需要PIL
。但是如果你想使用一些不太流行的图像格式,那么你可能需要pillow
。
import os
#from tkinter import *
import tkinter as tk # PEP8: `import *` is not preferred
from PIL import ImageTk, Image
# --- functions ---
def my_image(img, row, column) :
fullpath = os.path.join("C:/Users/Mark/Downloads/test/", img)
#pic = ImageTk.PhotoImage(Image.open(fullpath))
# or
#pic = ImageTk.PhotoImage(file=fullpath)
# or even without `PIL/pillow` for `png`
pic = tk.PhotoImage(file=fullpath)
my_img = tk.Label(image=pic)
my_img.grid(row=row, column=column)
my_img.pic = pic # solution for bug in `PhotoImage`
return my_img
# --- main ---
root = tk.Tk()
image1 = my_image("luigi_icon.png", 0, 1)
root.mainloop()