Кодирование и декодирование .gif-файла для использования с pyglet и преобразования в .exe с помощью pyinstaller

#python #base64 #pyinstaller #animated-gif #pyglet

#python #base64 #pyinstaller #анимированный-gif #pyglet

Вопрос:

Я хочу .gif вставить файл в .exe pyinstaller. Из моих исследований я должен закодировать gif в строку и декодировать эту строку, чтобы это было возможно. Кодирование строки и декодирование строки работают. Я получаю сообщение об ошибке при попытке использовать его в качестве ресурса анимации в pyglet. Что-то в кодировании-декодировании нарушило gif? Если есть другой предпочтительный способ сделать это, пожалуйста, дайте мне знать!

Шаг 1

 import base64

with open("test.gif", "rb") as imageFile:
    image = base64.b64encode(imageFile.read())
    print(image)
  

Шаг 2

Сохранение этой строки в файле .py следующим образом:

 image = b'AWggsegsegs/....'
  

Шаг 3

 import pyglet
import base64
from gif_string import image


decodedgif = base64.b64decode(image) # Works this far
animation = pyglet.resource.animation(decodedgif) # Error here
sprite = pyglet.sprite.Sprite(decodedgif)
  

Сообщение об ошибке гласит

 Traceback (most recent call last):
  File "...pygletresource.py", line 583, in animation
    identity = self._cached_animations[name]
  File "...AppDataLocalProgramsPythonPython36libweakref.py", line 131, in __getitem__
    o = self.data[key]()
KeyError: b'GIF89a
...
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "...pygletresource.py", line 435, in file
    location = self._index[name]
KeyError: b'GIF89a
...
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "C:..., line 7, in <module>
    animation = pyglet.resource.animation(decodedgif) # Error here
  File "...pygletresource.py", line 585, in animation
    animation = pyglet.image.load_animation(name, self.file(name))
  File "...pygletresource.py", line 438, in file
    raise ResourceNotFoundException(name)
pyglet.resource.ResourceNotFoundException: Resource "b'GIF89ax00
...
...f9x88xc0xbexa4O"oxcfxe5x81x00x00;'" was not found on the path.
  Ensure that the filename has the correct captialisation.
  

Ответ №1:

Вместо pyglet.resource.animation() того, чтобы загружать только файлы, вы должны использовать pyglet.image.load_animation() . Его необязательный File параметр поддерживает файлоподобные объекты, поэтому вы должны создать один из них с помощью io.BytesIO() и передать его туда.

Комментарии:

1. Спасибо за ваш ответ! Я попробовал то, что вы сказали, и запустил его без ошибок. Однако воспроизведение gif — это просто большой белый квадрат, мигающий import pyglet import base64 from gif_string import * from io import BytesIO image1 = base64.b64decode(image) decodedgif = BytesIO(image1) animation = pyglet.image.load_animation('gif.gif', file=decodedgif) sprite = pyglet.sprite.Sprite(animation) win = pyglet.window.Window(width=sprite.width, height=sprite.height) win.clear() sprite.draw() pyglet.app.run()

2. @Tireless22 Это ожидаемый результат, когда вы пытаетесь использовать его таким образом. win.clear() и sprite.draw() должен быть завернут в on_draw() событие, см. Здесь . Анимированные спрайты должны быть… ну … анимированный =)