Как изменить и переместить изображение на холсте tkinter одновременно?

внешность функции Я пишу код, который показывает анимацию в виде Flipbook.

Поэтому этот код должен изменить изображение и переместить координату одновременно. Я написал код. Однако иногда анимация отстает.

Я снял видео анимации, а затем обнаружил проблему.

В моем коде программа сначала меняет координаты, а затем меняет картинку. На самом деле этот код практически не имеет проблем, но иногда он отстает, тогда он будет только перемещать картинку. И через некоторое время это изменит картину. Поэтому я предполагаю, что мне нужно использовать какую-то функцию, которая может изменить изображение и одновременно перемещать изображение. Есть ли способ понять это?

Вот мой код

import tkinter as tk

class App(object):

    def GUI(self):

        root=tk.Tk()
        root.geometry("600x600")

        self.pic001=tk.PhotoImage(file="picture001.png")
        self.pic002=tk.PhotoImage(file="picture002.png")

        self.canvas = tk.Canvas(bg="black", width=796, height=816)
        self.canvas.place(x=0, y=0)

        self.item=self.canvas.create_image(0, 0, image=self.pic001, anchor=tk.NW)

        self.canvas.move(self.item,-51,10)
        self.canvas.itemconfig(self.item, image = self.pic002)    

        root.mainloop()

app=App()

app.GUI()

1 ответ

Вот простой анимационный скрипт.

Я нарисовал 6 изображений, а затем скопировал 5 из них для отражения отскока.

Я рисую новое изображение каждый раз вместо того, чтобы перемещать изображение.

import tkinter as tk
from os import walk


class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry("600x300")
        self.image_names = []
        self.index_tracker = 0
        self.location = 1
        self.canvas = tk.Canvas(self, width=2000)
        self.canvas.pack()
        for(dirpath, dirnames, filenames) in walk('./Flip/'):
            for name in filenames:
                self.image_names.append(tk.PhotoImage(file="{}{}".format(dirpath, name)))

        tk.Button(self, text='Start animation!', command=self.start_animation).pack()

    def start_animation(self):
        if self.location < 80:
            self.canvas.delete('all')
            if self.index_tracker < len(self.image_names):
                self.canvas.create_image(self.location * 10, 75, image=self.image_names[self.index_tracker])
                self.location += 1
                self.index_tracker += 1
                self.after(100, self.start_animation)
            else:
                self.index_tracker = 0
                self.start_animation()


if __name__ == "__main__":
    App().mainloop()

Вы можете получить файлы изображений для этой анимации на моем Github здесь.

Результаты:

Другие вопросы по тегам