Tkinter: перемещение Gif на холсте без PIL

У меня проблема с tkinter для python 3. Я хотел бы создать анимированный игровой персонаж в python, tkinter без использования PIL. Я нашел способ анимировать персонажа с помощью gif, но я не знаю, как переместить gif. Я пытался использовать canvas.move вот мой код:

from tkinter import *
import os
import time
root = Tk()
c = Canvas(root,width = 500,height = 500)
c.pack()
frames = [PhotoImage(file=(os.path.expanduser("~/Desktop/DaQueenIDLE.gif")),format = 'gif -index %i' % (i)) for i in range(2)]
def update(ind):
    frame = frames[ind]
    ind += 1
    if ind >= 2:
        ind = 0
    label.configure(image=frame)
    root.after(100, update, ind)
label = Label(root)
label.pack()
root.after(0, update, 0)
c.move(frames,0,-100)
root.update()
root.mainloop()

person Dragsaw Dragon    schedule 06.02.2018    source источник
comment
Под перемещением вы подразумеваете перемещение на экране, верно? ось х-у?   -  person Nae    schedule 07.02.2018
comment
Да, я имел в виду переместиться, чтобы переместиться на экране.   -  person Dragsaw Dragon    schedule 07.02.2018


Ответы (1)


move — это метод Canvas, и его первый аргумент должен быть элементом на Canvas.

В вашем случае frames не является элементом Canvas.

Заменять:

def update(ind):
    #...
    label.configure(image=frame)
    root.after(100, update, ind)
label = Label(root)
label.pack()

с участием:

def update(ind):
    #...
    c.itemconfig(character, image=frame)
    c.move(character, 1, 1)
    root.after(100, update, ind)
character = c.create_image((47,47), image=frames[0])

Чтобы преобразовать вашу метку в элемент изображения в Canvas и переместить ее.

Пример

Ниже приведен полный пример, который загружает (вы можете прокомментировать download_images после первоначального запуска) .gif-изображения ниже онлайн:

813

а затем перемещает изображение во время анимации между ними:

try:                        # In order to be able to import tkinter for
    import tkinter as tk    # either in python 2 or in python 3
except ImportError:
    import Tkinter as tk


def download_images():
    # In order to fetch the image online
    try:
        import urllib.request as url
    except ImportError:
        import urllib as url
    url.urlretrieve("https://i.stack.imgur.com/57uJJ.gif", "13.gif")
    url.urlretrieve("https://i.stack.imgur.com/8LThi.gif", "8.gif")


def animate_and_move(i):
    i = (i + 1) % 2
    canvas.itemconfig(moving_image, image=canvas.images[i])
    canvas.move(moving_image, 1, 1)
    canvas.after(100, animate_and_move, i)


if __name__ == '__main__':
    download_images() # comment out after initial run
    root = tk.Tk()
    canvas = tk.Canvas(root, height=644, width=644, bg='#ffffff')
    canvas.images = list()
    canvas.images.append(tk.PhotoImage(file="8.gif"))
    canvas.images.append(tk.PhotoImage(file="13.gif"))
    moving_image = canvas.create_image((164, 164), image=canvas.images[0])
    animate_and_move(0)
    canvas.pack()
    root.mainloop()

Обратите внимание, если:

import tkinter
tkinter.TkVersion >= 8.6

возвращает True, то файлы .png также поддерживаются без дополнительной библиотеки.

person Nae    schedule 06.02.2018
comment
Извините, что представил это как правильный ответ только сейчас, я, должно быть, забыл или не знал об этом, так как это было давно, и я был новичком в stackoverflow. Спасибо еще раз в любом случае. Ваше здоровье - person Dragsaw Dragon; 15.11.2019