2016-07-24 2 views
1

У меня есть изображение, которое сохраняется в файле test.bmp, и этот файл перезаписывается 2 раза в секунду
(Я хочу показать 2 изображения в секунду).Как я могу периодически менять изображение tkinter?

Вот то, что я до сих пор:

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

Но я не знаю, как я могу обновить изображение каждые полсекунды?
Я использую Python3 и Tkinter.

+0

Просто создать обратный вызов по таймеру –

+0

@PadraicCunningham могли бы вы привести пример или объяснить немного больше. Я новичок в этом. – lads

+1

'root.after (500, your_function)', где вы добавляете изображение –

ответ

2

Gee, код в вашем вопросе выглядит очень familiar ...

Придумывая ответ, состоящий из протестированного кода осложняется необходимостью иметь графический файл будет обновлен каким-то таинственным неустановленным процессом. Это делается в коде ниже, создавая отдельный поток, который периодически перезаписывает файл изображения независимо от основного процесса. Я попытался очертить этот код от остальных комментариями, потому что я чувствовал, что это несколько отвлекает и делает вещи более сложными, чем они есть на самом деле.

Основной вывод заключается в том, что вам нужно будет использовать универсальный виджет tkinter after(), чтобы запланировать обновление изображения в будущем. Необходимо также позаботиться о том, чтобы сначала создать объект изображения холста, чтобы он мог быть обновлен на месте позже. Это необходимо, потому что могут присутствовать другие объекты холста, и в противном случае обновленное изображение могло бы покрыть их в зависимости от относительного размещения, если место-владелец не был создан (поэтому идентификатор объекта изображения будет сохранен, чтобы впоследствии использоваться для изменения Это).

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() 
Смежные вопросы