Как я могу периодически менять изображение tkinter?

1

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

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

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 не могли бы вы привести пример или объяснить немного больше. Я новичок в этом.
Показать ещё 2 комментария
Теги:
python-3.x
image
tkinter

1 ответ

1
Лучший ответ

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

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

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

from PIL import Image, ImageTk
import tkinter as tk

#------------------------------------------------------------------------------
# Code to simulate background process periodically updating the image file.
# Note: 
#   It 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()

Ещё вопросы

Сообщество Overcoder
Наверх
Меню