Tkinter:在没有PIL的情况下在画布上移动Gif

时间:2018-02-06 20:46:32

标签: python tkinter gif animated-gif tkinter-canvas

我在tkinter for 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()

1 个答案:

答案 0 :(得分:1)

move是Canvas的一种方法,它的第一个参数需要是Canvas上的一个项目。

在您的情况下,const [result1, result2] = await Promise.all([promise1, promise2]) 不是画布上的项目。

替换:

frames

使用:

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

将标签转换为Canvas中的图像项并移动它。

实施例

以下是下载的完整示例(您可以在初次运行后发表评论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]) ).gif图片在线下方:

8 13

然后在两者之间动画时移动图像:

download_images

请注意:

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 ,然后也支持.png文件而不需要额外的库。