2016-07-24 9 views
1

Ich habe ein Bild, das in einer Datei test.bmp gespeichert ist und diese Datei wird 2 mal pro Sekunde
überschrieben (Ich möchte 2 Bilder pro Sekunde anzeigen).Wie kann ich ein tkinter Bild regelmäßig ändern?

Hier ist, was ich bisher:

import tkinter as tk 
from PIL import Image, ImageTk 

root = tk.Tk() 
img_path = 'test.bmp' 
img = ImageTk.PhotoImage(Image.open(img_path), Image.ANTIALIAS)) 

canvas = tk.Canvas(root, height=400, width=400) 
canvas.create_image(200, 200, image=img) 
canvas.pack() 

root.mainloop() 

Aber ich weiß nicht, wie kann ich das Bild aufzufrischen jede Sekunde ½?
Ich benutze Python3 und Tkinter.

+0

Erstellen Sie einfach einen Rückruf auf einem Timer –

+0

@PadraicCunningham könnten Sie bitte ein Beispiel oder zu erklären, ein bisschen mehr geben. Ich bin neu in diesem Bereich. – lads

+1

'root.after (500, your_function)', wobei Sie die Funktion –

Antwort

2

Gee, sieht der Code in Ihrer Frage sehr familiar ...

mit einer Antwort getesteter Code Coming up umfasste wurde durch die Notwendigkeit kompliziert, die Bilddatei zu haben, von einem geheimnisvollen unspecified Prozess aktualisiert werden. Dies geschieht im folgenden Code, indem ein separater Thread erstellt wird, der die Image-Datei unabhängig vom Hauptprozess periodisch überschreibt. Ich habe versucht, diesen Code vom Rest mit Kommentaren zu umreißen, weil ich das Gefühl hatte, dass es etwas ablenkend wirkt und die Dinge komplexer erscheinen lässt, als sie wirklich sind.

Das Wichtigste ist, dass Sie das universelle tkinter Widget after() Methode verwenden müssen, um das Bild zu planen, das zu einem späteren Zeitpunkt aktualisiert werden soll. Es muss auch darauf geachtet werden, dass zuerst ein Platzhalter-Canvas-Bildobjekt erstellt wird, damit es später an Ort und Stelle aktualisiert werden kann. Dies ist erforderlich, da andere Canvas-Objekte vorhanden sein können und das aktualisierte Bild diese andernfalls je nach relativer Platzierung verdecken könnte, wenn kein Platzhalter erstellt wurde (die Bildobjekt-ID wird daher gespeichert und später zur Änderung verwendet) es).

from PIL import Image, ImageTk 
import tkinter as tk 

#------------------------------------------------------------------------------ 
# Code to simulate background process periodically updating the image file. 
# Note: 
# It's important that this code *not* interact directly with tkinter 
# stuff in the main process since it doesn't support multi-threading. 
import itertools 
import os 
import shutil 
import threading 
import time 

def update_image_file(dst): 
    """ Overwrite (or create) destination file by copying successive image 
     files to the destination path. Runs indefinitely. 
    """ 
    TEST_IMAGES = 'test_image1.png', 'test_image2.png', 'test_image3.png' 

    for src in itertools.cycle(TEST_IMAGES): 
     shutil.copy(src, dst) 
     time.sleep(.5) # pause between updates 
#------------------------------------------------------------------------------ 

def refresh_image(canvas, img, image_path, image_id): 
    try: 
     pil_img = Image.open(image_path).resize((400,400), Image.ANTIALIAS) 
     img = ImageTk.PhotoImage(pil_img) 
     canvas.itemconfigure(image_id, image=img) 
    except IOError: # missing or corrupt image file 
     img = None 
    # repeat every half sec 
    canvas.after(500, refresh_image, canvas, img, image_path, image_id) 

root = tk.Tk() 
image_path = 'test.png' 

#------------------------------------------------------------------------------ 
# More code to simulate background process periodically updating the image file. 
th = threading.Thread(target=update_image_file, args=(image_path,)) 
th.daemon = True # terminates whenever main thread does 
th.start() 
while not os.path.exists(image_path): # let it run until image file exists 
    time.sleep(.1) 
#------------------------------------------------------------------------------ 

canvas = tk.Canvas(root, height=400, width=400) 
img = None # initially only need a canvas image place-holder 
image_id = canvas.create_image(200, 200, image=img) 
canvas.pack() 

refresh_image(canvas, img, image_path, image_id) 
root.mainloop()