Member 13670629 Ответов: 1

Как создать движущийся изменяющийся анимирующий gif в tkinter, Python


Я столкнулся с проблемой при создании изменяющейся анимации в python 3, tkinter. Я пытался создать изменяющуюся gif-анимацию плеера, когда обнаружил, что анимация не меняется, когда я нажимаю различные клавиши, которые были определены ранее. Ошибка заключается в том, что фреймы не определены, и я не знаю, как определить фреймы без их вмешательства

Вот мой код:

from tkinter import *
import os
import time

root = Tk()

LEFT_CHAR = input('LEFT BUTTON: ')
RIGHT_CHAR = input('RIGHT BUTTON: ')
UP_CHAR = input('UP BUTTON: ')
DOWN_CHAR = input('DOWN BUTTON: ')
ATK_CHAR = input('ATTACK BUTTON: ')

movespeed = 20

canvasH = 900
canvasW = 1200

animspdIDLE = 300
animspdATK = 300
animspdLEFT = 300
animspdRIGHT = 300
animspdUP = 300
animspdDOWN = 300

framerangeIDLE = 2
framerangeATK = 2
framerangeLEFT = 2
framerangeRIGHT = 2
framerangeUP = 2
framerangeDOWN = 2

def animcontrollermethod(event):

    if event.char == LEFT_CHAR:
        frames = [PhotoImage(file =(os.path.expanduser("~/Desktop/DaQueenLEFT.gif")),format = 'gif -index %i' % (i)) for i in range(framerangeLEFT)]
        currentframelength = framerangeLEFT
        animspdcurrent = animspdLEFT

    elif event.char == RIGHT_CHAR:
        frames = [PhotoImage(file=(os.path.expanduser("~/Desktop/DaQueenRIGHT.gif")),format = 'gif -index %i' % (i)) for i in range(framerangeRIGHT)]
        currentframelength = framerangeRIGHT
        animspdcurrent = animspdRIGHT

    elif event.char == UP_CHAR:
        frames = [PhotoImage(file=(os.path.expanduser("~/Desktop/DaQueenUP.gif")),format = 'gif -index %i' (i)) for i in range(framerangeUP)]
        currentframelength = framerangeUP
        animspdcurrent = animspdUP

    elif event.char == DOWN_CHAR:
        frames = [PhotoImage(file=(os.path.expanduser("~/Desktop/DaQueenDOWN.gif")),format = 'gif -index %i'(i)) for i in range(framerangeDOWN)]
        currentframelength = framerangeDOWN
        animspdcurrent = animspdDOWN

    elif event.char == ATK_CHAR:
        frames = [PhotoImage(file=(os.path.expanduser("~/Desktop/DaQueenATK.gif")),format = 'gif -index %i' % (i)) for i in range(framerangeATK)]
        currentframelength = framerangeATK
        animspdcurrent = animspdATK

    else:
        frames = [PhotoImage(file=(os.path.expanduser("~/Desktop/DaQueenIDLE.gif")),format = 'gif -index %i'% (i)) for i in range(framerangeIDLE)]
        currentframelength = framerangeIDLE
        animspdcurrent = animspdIDLE

def move(event):
    if event.char == UP_CHAR:
        c.move(character, 0, -movespeed)
    elif event.char == DOWN_CHAR:
        c.move(character, 0, movespeed)
    elif event.char == LEFT_CHAR:
        c.move(character, -movespeed, 0)
    elif event.char == RIGHT_CHAR:
        c.move(character, movespeed, 0)

c = Canvas(root,width = canvasW, height = canvasH)

c.bind("<KeyPress>",animcontrollermethod)
c.bind('<KeyPress>',move)

c.pack()
c.focus_set()

def update(ind):
    frame = frames[ind]
    ind += 1

    if ind >= currentframelength:
        ind = 0

    c.itemconfig(character, image=frame)
    root.after(animspdcurrent, update, ind)

character = c.create_image((canvasW/2,canvasH/2), image=frames[0])

root.after(0, update, 0)
root.update()

root.mainloop()

EDIT: этот код вызывает ошибку, говоря, что фреймы не определены. Как я могу определить кадры, не вмешиваясь в них и не показывая ни одной анимации? Моя цель-создать сценарий так, чтобы при нажатии определенной клавиши анимация менялась в зависимости от того, что я нажал, и двигалась в соответствующем направлении.

Спасибо Вам за все!

Я создал этот вопрос на "StackOverflow"
но никто еще не ответил. Для тех кто заинтересован вот ссылка:

python - создание изменяющегося изображения/gif в tkinter, которое может перемещаться с помощью PhotoImage (без PIL) [без ответа] - переполнение стека[^]



Что я уже пробовал:

Я попытался отладить свой код, я потратил 2 дня, пытаясь выяснить, что не работает, проверил имена файлов и нашел решение, которое работает. То, что я считал правдоподобным решением, никогда не кажется решением, поэтому я обратился к интернету, чтобы помочь мне.

1 Ответов

Рейтинг:
1

Member 14766525

Вы еще не установили список фреймов в
глобальная окружающая среда. Сделать это,

def animcontrollermethod(событие):
глобальных периодов
..
..
# ваш код