Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tkinter每x秒更新一次标签图像_Python_Tkinter - Fatal编程技术网

Python Tkinter每x秒更新一次标签图像

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

我有一个用于图像幻灯片放映的简单Tkinter应用程序

我正在使用
.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()
,因此使用上述逻辑是不合适的。