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()
Erstellen Sie einfach einen Rückruf auf einem Timer –
@PadraicCunningham könnten Sie bitte ein Beispiel oder zu erklären, ein bisschen mehr geben. Ich bin neu in diesem Bereich. – lads
'root.after (500, your_function)', wobei Sie die Funktion –