我正在使用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()
感谢您的帮助!
答案 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中。我必须回到前一步,然后我才能继续前进去看新的。
我正在研究解决最后一个问题的解决方案。