按顺序更新 tkinter 标签图像
Updating tkinter label image sequentially
我正在尝试在标签图像上按顺序显示所选图像的列表,但我的所有尝试都跳到了最后一张图像。请帮助
from tkinter import *
from tkinter.filedialog import askopenfile, askdirectory, askopenfilenames
from PIL import ImageTk, Image
def load_images(window):
global files
files = askopenfilenames(parent=window, title="Choose image(s)", filetype=[("Images", "*.Jpg")])
files = iter(files)
update_image(window, next(files))
def update_image(window, img):
image = ImageTk.PhotoImage(Image.open(img))
label_img.configure(image=image)
label_img.image = image
img = next(files)
if img:
window.after(2, update_image(window, img))
else:
return
if __name__ == "__main__":
root = Tk()
menubar = Menu(root)
file = Menu(menubar, tearoff=0)
file.add_command(label="Load image(s)", command=lambda:load_images(root))
file.add_command(label="Exit", command=root.quit)
menubar.add_cascade(label="File", menu=file)
root.config(menu=menubar)
test_image = ImageTk.PhotoImage(image=Image.open("test.jpg"))
global label_img
label_img = Label(root, image=test_image, bg="#2D2D2D")
label_img.pack(fill=X, padx=10)
root.mainloop()
此代码抛出以下内容。
window.after(2, update_image(window, img))
File "......./Documents/python/v3/GUI.py", line 21, in update_image
img = next(files)
StopIteration
首先,如果没有要迭代的项目,next(files)
会引发异常,因此使用 if img:
无法修复异常。使用 try / except
.
第二个 window.after(2, update_image(window, img))
将立即执行 update_image(...)
,而不是在 2 毫秒后执行(您的意思是实际上是 2 秒吗?)。
下面是修改后的 update_image()
函数:
def update_image(window, img):
image = ImageTk.PhotoImage(file=img)
label_img.configure(image=image)
label_img.image = image
try:
img = next(files)
window.after(2000, update_image, window, img) # used 2000 instead of 2
except:
print("no more image")
我正在尝试在标签图像上按顺序显示所选图像的列表,但我的所有尝试都跳到了最后一张图像。请帮助
from tkinter import *
from tkinter.filedialog import askopenfile, askdirectory, askopenfilenames
from PIL import ImageTk, Image
def load_images(window):
global files
files = askopenfilenames(parent=window, title="Choose image(s)", filetype=[("Images", "*.Jpg")])
files = iter(files)
update_image(window, next(files))
def update_image(window, img):
image = ImageTk.PhotoImage(Image.open(img))
label_img.configure(image=image)
label_img.image = image
img = next(files)
if img:
window.after(2, update_image(window, img))
else:
return
if __name__ == "__main__":
root = Tk()
menubar = Menu(root)
file = Menu(menubar, tearoff=0)
file.add_command(label="Load image(s)", command=lambda:load_images(root))
file.add_command(label="Exit", command=root.quit)
menubar.add_cascade(label="File", menu=file)
root.config(menu=menubar)
test_image = ImageTk.PhotoImage(image=Image.open("test.jpg"))
global label_img
label_img = Label(root, image=test_image, bg="#2D2D2D")
label_img.pack(fill=X, padx=10)
root.mainloop()
此代码抛出以下内容。
window.after(2, update_image(window, img))
File "......./Documents/python/v3/GUI.py", line 21, in update_image
img = next(files)
StopIteration
首先,如果没有要迭代的项目,next(files)
会引发异常,因此使用 if img:
无法修复异常。使用 try / except
.
第二个 window.after(2, update_image(window, img))
将立即执行 update_image(...)
,而不是在 2 毫秒后执行(您的意思是实际上是 2 秒吗?)。
下面是修改后的 update_image()
函数:
def update_image(window, img):
image = ImageTk.PhotoImage(file=img)
label_img.configure(image=image)
label_img.image = image
try:
img = next(files)
window.after(2000, update_image, window, img) # used 2000 instead of 2
except:
print("no more image")