うわあ、あなたの問題のコードは非常にfamiliarに見える...
は、イメージファイルがいくつかの神秘的な不特定のプロセスによって更新されていする必要性によって複雑になりました。これは、メインプロセスとは独立したイメージファイルを定期的に上書きする別のスレッドを作成することにより、以下のコードで実行されます。私はそれが幾分気を散らしていて、実際よりも複雑なものに見えるので、このコードを残りの部分から説明するようにしました。
普遍的なtkinterウィジェットafter()
メソッドを使用して、後でイメージをリフレッシュするようにスケジュールする必要があるということです。プレースホルダーのキャンバスイメージオブジェクトを作成して後でインプレースで更新できるようにする必要もあります。これは、他のキャンバスオブジェクトが存在する可能性があるため必要です。そうしないと、プレースホルダが作成されていない場合、相対的な配置に応じて更新されたイメージを覆い隠す可能性があります(イメージオブジェクトIDは、それ)。
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()
タイマーでコールバックを作成するだけです。 –
@PadraicCunninghamでは、例を挙げたり、少し説明してください。私はこれに新しいです。 – lads
'root.after(500、your_function)'、関数を使って画像を追加します –