2013-08-13 10 views
0

Je suis en train de créer une application pour afficher en continu une image extraite d'une caméra IP. J'ai compris comment récupérer l'image et comment afficher l'image en utilisant Tkinter. Mais je n'arrive pas à l'actualiser continuellement. Utiliser Python 2.7+.Rafraîchir l'image dans la fenêtre Tkinter

Voici le code que j'ai jusqu'à présent.

import urllib2, base64 
from PIL import Image,ImageTk 
import StringIO 
import Tkinter 

URL = 'http://myurl.cgi' 
USERNAME = 'myusername' 
PASSWORD = 'mypassword' 

def fetch_image(url,username,password): 
    # this code works fine 
    request = urllib2.Request(url) 
    base64string = base64.encodestring('%s:%s' % (username, password)).replace('\n', '') 
    request.add_header("Authorization", "Basic %s" % base64string) 
    result = urllib2.urlopen(request) 
    imgresp = result.read() 
    img = Image.open(StringIO.StringIO(imgresp)) 
    return img 

root = Tkinter.Tk() 
img = fetch_image(URL,USERNAME,PASSWORD) 
tkimg = ImageTk.PhotoImage(img) 
Tkinter.Label(root,image=tkimg).pack() 
root.mainloop() 

Comment dois-je modifier le code afin que le fetch_image est appelé à plusieurs reprises et sa sortie mis à jour dans la fenêtre Tkinter?

Notez que je n'utilise aucun événement-bouton pour déclencher le rafraîchissement de l'image, mais plutôt qu'il devrait être rafraîchi automatiquement, disons, toutes les secondes.

Répondre

2

Voici une solution qui utilise la fonction Tk.after de Tkinter, qui planifie les prochains appels aux fonctions. Si vous remplacez tout après votre définition fetch_image avec le snipped ci-dessous, vous obtiendrez le comportement que vous avez décrit:

root = Tkinter.Tk() 
label = Tkinter.Label(root) 
label.pack() 
img = None 
tkimg = [None] # This, or something like it, is necessary because if you do not keep a reference to PhotoImage instances, they get garbage collected. 

delay = 500 # in milliseconds 
def loopCapture(): 
    print "capturing" 
# img = fetch_image(URL,USERNAME,PASSWORD) 
    img = Image.new('1', (100, 100), 0) 
    tkimg[0] = ImageTk.PhotoImage(img) 
    label.config(image=tkimg[0]) 
    root.update_idletasks() 
    root.after(delay, loopCapture) 

loopCapture() 
root.mainloop()