<p>将<code>while</code>与tkinter一起使用将导致<code>mainloop()</code>出现一些问题,并将冻结该问题。您应该使用不会冻结GUI的<code>after(ms,func)</code>。一个非常简单的代码可以做到这一点,请看这里:</p>
<pre><code>from tkinter import *
from tkinter import filedialog
from PIL import ImageTk, Image
from glob import glob #for the path of the image
import random
root = Tk()
def anmuViewer():
global cb
choice = random.choice(all_img) #random choice of image from the list of img
cur = ImageTk.PhotoImage(file=choice) #make an image object
img_label.config(image=cur) #changing the image on the label
img_label.img = cur #keeping a reference to the image
cb = root.after(10000,anmuViewer) #repeating the function every 10 second
def restart(): #reset func from Roblochons code
global cb
if cb is not None:
root.after_cancel(cb)
cb = None
anmuViewer()
path = filedialog.askdirectory(title='Choose the directory with images') #ask the directory with the image.
png = glob(path+'/*.png') #pick all the png image
jpg = glob(path+'/*.jpg') #pick all the jpg image
all_img = png + jpg #concatenate both the list
img_label = Label(root) #image label, later to be configured
img_label.pack()
start_btn = Button(root, text = "Start", command=anmuViewer)
start_btn.pack(padx=10,pady=10)
next_btn = Button(root, text = 'Restart', command=restart)
next_btn.pack(padx=10,pady=10)
root.mainloop()
</code></pre>
<p>我已经用注释解释了代码,以便在移动中更容易理解。我没有假设图像的路径,所以我正在动态地选择路径,如您所见。代码看起来很长,因为为了更好地理解,我简化了大多数代码行</p>
<p>无论如何,您需要调整图像大小,使其适合每个人的屏幕,因为像素和屏幕分辨率因设备而异。看一看<a href="https://stackoverflow.com/questions/63787755/dynamic-resizing-of-image-using-pil-and-tkinter">here</a></p>