我试图在Python中同时打开多张照片:
import Tkinter as tk
import os
from PIL import Image, ImageTk
root = tk.Tk()
tk.Label(root, text="this is the root window").pack()
root.geometry("200x200")
for i in range(1, 6):
loc = os.getcwd() + '\pictures\pic%s.jpg'%(i)
img = Image.open(loc)
img.load()
photoimg = ImageTk.PhotoImage(img)
window = tk.Toplevel()
window.geometry("200x200")
tk.Label(window, text="this is window %s" % i).pack()
root.mainloop()
根据需要打开5个窗口(不包括根窗口),但图片不会显示。 建议? Thnx提前
答案 0 :(得分:0)
您需要在窗口中添加带有参数image=photoimg
的标签,以便显示图像。
您的代码:
import Tkinter as tk
import os
from PIL import Image, ImageTk
root = tk.Tk()
tk.Label(root, text="this is the root window").pack()
root.geometry("200x200")
for i in range(1, 6):
loc = os.getcwd() + '\pictures\pic%s.jpg'%(i)
img = Image.open(loc)
img.load()
photoimg = ImageTk.PhotoImage(img)
window = tk.Toplevel()
window.geometry("200x200")
tk.Label(window, text="this is window %s" % i).pack()
tk.Label(window, image=photoimg).pack()
root.mainloop()
答案 1 :(得分:0)
像乔纳·弗莱明(Jonah Fleming)所说的那样,添加image=photoimg
时,您必须保留对每个PhotoImage的引用,否则将photoimg
变量分配给另一个PhotoImage时将对它们进行垃圾回收。绕过此问题的最简单方法是将PhotoImage实例保留在列表中。可以这样做:
import Tkinter as tk
import os
from PIL import Image, ImageTk
root = tk.Tk()
tk.Label(root, text="this is the root window").pack()
root.geometry("200x200")
photoimage_list = [] # Create a list to hold the PhotoImages!
for i in range(1, 6):
loc = os.getcwd() + '\pictures\pic%s.jpg'%(i)
img = Image.open(loc)
img.load()
photoimg = ImageTk.PhotoImage(img)
photoimg.append(photoimage_list) # Add it to a list so it isn't garbage collected!!
window = tk.Toplevel()
window.geometry("200x200")
tk.Label(window, text="this is window %s" % i).pack()
tk.Label(window, image=photoimg).pack()
root.mainloop()
只需确保photoimage_list
列表不会被垃圾回收,那么就不要删除该列表/丢失所有强引用。
您可以在https://rushter.com/blog/python-garbage-collector/上了解有关垃圾回收的更多信息。