Python Tkinter每x秒更新一次标签图像
我有一个用于图像幻灯片放映的简单Tkinter应用程序 我正在使用Python Tkinter每x秒更新一次标签图像,python,tkinter,Python,Tkinter,我有一个用于图像幻灯片放映的简单Tkinter应用程序 我正在使用.after(100,旋转图像)每100毫秒更新一次与标签相关的图像。 updater()的定义是为了在窗口打开时将其作为无限循环运行 由于某些原因,图像只更新一次。它不会循环到列表中的项目2或以上。 我的目的是在1->2->3->1->2->3….中旋转图像 类似地,按钮与相同的功能rotate\u image 该按钮工作正常,可在图像列表中旋转 import tkinter as tk from tkinter import
.after(100,旋转图像)
每100毫秒更新一次与标签相关的图像。
updater()
的定义是为了在窗口打开时将其作为无限循环运行
由于某些原因,图像只更新一次。它不会循环到列表中的项目2或以上。
我的目的是在1->2->3->1->2->3….中旋转图像
类似地,按钮与相同的功能rotate\u image
该按钮工作正常,可在图像列表中旋转
import tkinter as tk
from tkinter import ttk
from PIL import Image, ImageTk
window = tk.Tk()
window.title("Image scroll")
window.geometry("800x600")
window.minsize(300, 300)
#load image, resize & place text
wx= 150
hx = 150
images =[ 'beach.jpg', 'DSC325.jpg','DSC323.jpg']
val=0
def load_img(img_name):
global photo1 # alternative fix for photoimage garbage colelction issue
img = Image.open(img_name)
img = img.resize((wx,hx), Image.ANTIALIAS)
photo1= ImageTk.PhotoImage(img)
return photo1
def rotate_image(event=None):
global val
# simple Rotation function to loop images `1->2->3->1->2->3.`
if val== len(images)-1:
val=0
else:
val +=1 # select next
img2= load_img(images[val])
img_panel.configure(image=img2)
img_panel.image = img2
def updater():
count=1
while count<=100:
window.after(100, rotate_image)
count+=1
#define main layout frames
frm_LEFT_outer = tk.Frame(master=window, width = 600,bg= '#beb7e2', relief=tk.GROOVE, borderwidth=2)
frm_LEFT = tk.Frame(master=frm_LEFT_outer, bg= '#beb7e2', relief=tk.GROOVE, borderwidth=2)
frm_LEFT_outer.pack(side =tk.LEFT, fill=tk.BOTH, expand=True )
frm_LEFT.pack(expand=True, )
img_panel = tk.Label(master=frm_LEFT, image=load_img(images[val]))
img_panel.pack(expand=True)
btn_next = ttk.Button(master=frm_LEFT, text="NEXT", width=8, command=rotate_image)
btn_next.pack(expand=False)
updater() # auto loop through images while the window is open
window.mainloop()
将tkinter作为tk导入
从tkinter导入ttk
从PIL导入图像,ImageTk
window=tk.tk()
窗口标题(“图像滚动”)
窗几何(“800x600”)
窗口大小(300300)
#加载图像、调整大小并放置文本
wx=150
hx=150
images=['beach.jpg'、'DSC325.jpg'、'DSC323.jpg']
val=0
def load_img(img_名称):
全局photo1#photoimage垃圾收集问题的替代修复方案
img=Image.open(img\u名称)
img=img.resize((wx,hx),Image.ANTIALIAS)
photo1=ImageTk.PhotoImage(img)
返回照片1
def rotate_图像(事件=无):
全局val
#简单的旋转功能循环图像'1->2->3->1->2->3`
如果val==len(图像)-1:
val=0
其他:
val+=1#选择下一步
img2=加载\u img(图像[val])
img_面板配置(图像=img2)
img_panel.image=img2
def更新程序():
计数=1
当count时,您错误地使用了after()
。更改更新程序()
,如下所示:
def updater():
rotate_image()
window.after(100, updater)
您以错误的方式使用了after()
。更改更新程序(),如下所示:
def updater():
rotate_image()
window.after(100, updater)
您连续调用了
.after()
一百次,因此0.1秒后,您可以连续快速调用rotate\u image()
。您需要一次调用.after()
一次,然后在延迟函数中再次调用它。您连续调用了.after()
一百次,因此0.1秒后,您会得到一百次对rotate\u image()
的快速连续调用。您需要一次调用一次.after()
,然后在延迟函数中再次调用。谢谢。它解决了这个问题。所以这种方法是递归调用函数。是否有其他方法可以将旋转图像函数句柄正确地传递到after()
中。如果要定期调用rotate\u image()
,可以使用after(100,rotate\u image)
,但也需要在rotate\u image()
末尾调用after(100,rotate\u image)
。但是,由于按钮也会调用rotate\u image()
,因此使用上述逻辑是不合适的。谢谢。它解决了这个问题。所以这种方法是递归调用函数。是否有其他方法可以将旋转图像函数句柄正确地传递到after()
中。如果要定期调用rotate\u image()
,可以使用after(100,rotate\u image)
,但也需要在rotate\u image()
末尾调用after(100,rotate\u image)
。但是,由于按钮也会调用rotate\u image()
,因此使用上述逻辑是不合适的。