TKinter更新图像列表

时间:2017-09-22 07:52:57

标签: python tkinter os.path

我正在使用TKinter来显示文件夹的一些图像。这些是从列表中加载的:

image_list = [os.path.join("/home/pi/fotos/previews",fn) for fn in next(os.walk("/home/pi/fotos/previews"))[2]]

但该文件夹不时会更新新照片,所以TKinter必须以某种方式刷新,以显示这些新图像。

如何使用新的图像列表刷新TKinter?

这里是完整的代码:

#!/usr/bin/python

import Image
import ImageTk
import Tkinter
import glob
import sys
import os.path
import os

image_list = [os.path.join("/home/pi/fotos/previews",fn) for fn in next(os.walk("/home/pi/fotos/previews"))[2]]
sorted_imagelist = sorted(image_list, key=str.swapcase, reverse=True)

current = 0

def move(delta):
    global current, sorted_imagelist
    if not (0 <= current - delta < len(sorted_imagelist)):
        tkMessageBox.showinfo('End', 'No more image.')
        return
    current -= delta
    image = Image.open(sorted_imagelist[current])
    photo = ImageTk.PhotoImage(image)
    label['image'] = photo
    label.photo = photo


root = Tkinter.Tk()

root.configure(background="#eee")

label = Tkinter.Label(root, compound=Tkinter.TOP, bg="#eee")
label.pack()
label.place(x=90, y=30)

frame = Tkinter.Frame(root, bg="#eee")
frame.pack()

Tkinter.Button(frame, text='Refresh', height=10, width=25, command=root.update).pack(side=Tkinter.LEFT)
Tkinter.Button(frame, text='Previous picture', height=10, width=25, command=lambda: move(-1)).pack(side=Tkinter.LEFT)
Tkinter.Button(frame, text='Next picture', height=10, width=25, command=lambda: move(+1)).pack(side=Tkinter.LEFT)
Tkinter.Button(frame, text='Quit', height=10, width=25, command=root.quit).pack(side=Tkinter.LEFT)

move(0)

root.attributes('-fullscreen', True)
root.mainloop()

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

如果您在时间A存储文件名列表,然后在时间B获取新的文件名列表,那么您可以使用set操作symmetric_difference查找B中不是的项目在A(即:新文件)。 Tk after方法可以让您安排一个函数来定期执行此操作。然后,您可以为新文件创建新的Tk图像,并将其添加到Tk图像列表中。

每个平台都有一些API,用于在文件系统发生更改时通知您的应用程序。在Windows上,FindFirstChangeNotification函数及其朋友或Linux上的inotify。但是,最简单的跨平台方法是在计时器上轮询目录的内容。

答案 1 :(得分:0)

我找到了一个解决方案,并将回答我自己的问题以帮助其他人:

实际上我创建了一个只会再次检查列表的函数。

    def refresh(delta):

        global current, sorted_imagelist

        text_list = next(os.walk("/home/pi/fotos/previews"))[2]
        image_list = [os.path.join("/home/pi/fotos/previews",fn) for fn in next(os.walk("/home/pi/fotos/previews"))[2]]

        sorted_textlist = sorted(text_list, key=str.swapcase, reverse=True)
        sorted_imagelist = sorted(image_list, key=str.swapcase, reverse=True)


        print (sorted_imagelist)
        print ('Refreshed')

此功能每秒调用一次,因此一切都很快。

    def updater():
      threading.Timer(1.0, updater).start()
      refresh(0)

    updater()   

到目前为止,我遇到的唯一问题是,当前查看过的图片是旧列表的最后一张图片时,“&#39; new&#39;最后一张照片未正确加载到TKinter中。我必须回到前一步,然后我才能继续前进去看新的。

我正在研究解决最后一个问题的解决方案。