2017-09-22 11 views
0

私はTKinterを使ってフォルダのいくつかのイメージを表示しています。これらは、リストからロードされます。TKinterアップデートイメージリスト

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

しかし、フォルダには、随時新しい写真を更新beeingてされているので、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

時刻Aにファイル名のリストを保存し、その後時刻Bに新しいファイル名のリストを取得した場合は、set操作symmetric_differenceを使用して、Aにはない項目を見つけることができます)。 Tk afterメソッドを使用すると、間隔を置いてこれを行う関数をスケジュールすることができます。新しいファイル用の新しいTkイメージを作成し、Tkイメージのリストに追加することができます。

各プラットフォームには、ファイルシステムに変更が発生したときにアプリケーションに通知するためのAPIがあります。 Windowsでは、FindFirstChangeNotificationの機能とその友人、またはLinuxでのinotifyです。ただし、最も単純なクロスプラットフォームの方法は、タイマーでディレクトリの内容をポーリングすることです。

+0

私はアイデアがありました。それはそれほど違っていませんでした。単に時折リストを再度ロードするだけです。あまりにも多くの画像があることはありませんので、その操作の速度は大丈夫です。しかし、私の質問は、新しいファイルを読み込む方法ではなく、TKinterを更新してシステムに新しいファイルを表示する方法でした。 –

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() 

唯一の問題、私は現在見られる画像は、古いリストの最後のものであるとき、「新しい」最後の写真は、Tkinterのに正しくロードされていないことであり、これまで持っています。私は前のページに戻る必要があり、私は新しいものを見るために前進することができます。

私は最後の問題を解決するための解決策に取り組んでいます。