Problem mit wx.animate.Animation

Plattformunabhängige GUIs mit wxWidgets.
Antworten
hmueller
User
Beiträge: 39
Registriert: Montag 27. November 2006, 16:07
Wohnort: Linz, Oberösterreich

Hallo,

Ich möchte ein animiertes GIF anzeigen, will das aber nicht im Filesystem irgendwo herumliegen lassen, sondern direkt aus dem Code laden.

An sich nimmt wx.animate.Animation() nur den Pfad zur Datei an, es soll aber auch gehen, wenn man folgendes macht:

Code: Alles auswählen

ani = wx.animate.Animation()
ani.Load(stream)
ctrl = wx.animate.AnimationCtrl(parent, -1, ani)
nun weiss ich aber nicht, was "stream" für ein Objekt sein soll, ich habe es mit einem normalen file object versucht, da bekomme ich zwar keine Fehlermeldung, aber Python schmiert mir ab.

Irgendjemand eine Idee?

Hannes

wxPython 2.8.1.1
Python 2.5
verzweifelt
I must not fear. Fear is the mind-killer. Fear is the little death that brings total obliteration.
I will face my fear. I will permit it to pass over me and through me. And when it has gone past I will turn the inner eye to see its path.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

hmueller hat geschrieben:es soll aber auch gehen, wenn man folgendes macht:

Code: Alles auswählen

ani = wx.animate.Animation()
ani.Load(stream)
ctrl = wx.animate.AnimationCtrl(parent, -1, ani)
nun weiss ich aber nicht, was "stream" für ein Objekt sein soll,
Hallo hmueller!

Wahrscheinlich ein ``StringIO``-Objekt.
Versuche das mal:

Code: Alles auswählen

from StringIO import StringIO

stream = StringIO()
f = file("dateiname", "rb")
stream.write(f.read())
f.close()
stream.seek(0)

ani = wx.animate.Animation()
ani.Load(stream)
ctrl = wx.animate.AnimationCtrl(parent, -1, ani)
Wenn das funktioniert, dann weißt du schon mal, dass du mit dem StringIO-Objekt arbeiten kannst. Dann musst du nur noch die Binärdaten des Bildes in einen String umwandeln und in den Quellcode schreiben.
Wenn du dann die Daten wieder als Binärdaten brauchst, dann wandelst du den String wieder in die Binärdaten um und schreibst diese in das StringIO-Objekt.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
hmueller
User
Beiträge: 39
Registriert: Montag 27. November 2006, 16:07
Wohnort: Linz, Oberösterreich

Super, das geht mal.
Ich Idiot habe natürlich beim open("dateiename") den Modus "rb" vergessen. Irgendwie klar, dass es dann nicht geht.

Was meinst Du mit dem:
Dann musst du nur noch die Binärdaten des Bildes in einen String umwandeln und in den Quellcode schreiben.
Wenn du dann die Daten wieder als Binärdaten brauchst, dann wandelst du den String wieder in die Binärdaten um und schreibst diese in das StringIO-Objekt.
Wie geht das am Besten?
I must not fear. Fear is the mind-killer. Fear is the little death that brings total obliteration.
I will face my fear. I will permit it to pass over me and through me. And when it has gone past I will turn the inner eye to see its path.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

hmueller hat geschrieben:Wie geht das am Besten?
Hi hmueller!

So:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import wx
import wx.animate
from StringIO import StringIO
import base64

wx.SetDefaultPyEncoding("iso-8859-1")


mailsearch_gif = """
R0lGODlhMAAtAIcAAAAAADMAAGYAAJkAAMwAAP8AAAAzADMzAGYzAJkzAMwzAP8zAABmADNmAGZm
AJlmAMxmAP9mAACZADOZAGaZAJmZAMyZAP+ZAADMADPMAGbMAJnMAMzMAP/MAAD/ADP/AGb/AJn/
AMz/AP//AAAAMzMAM2YAM5kAM8wAM/8AMwAzMzMzM2YzM5kzM8wzM/8zMwBmMzNmM2ZmM5lmM8xm
M/9mMwCZMzOZM2aZM5mZM8yZM/+ZMwDMMzPMM2bMM5nMM8zMM//MMwD/MzP/M2b/M5n/M8z/M///
MwAAZjMAZmYAZpkAZswAZv8AZgAzZjMzZmYzZpkzZswzZv8zZgBmZjNmZmZmZplmZsxmZv9mZgCZ
ZjOZZmaZZpmZZsyZZv+ZZgDMZjPMZmbMZpnMZszMZv/MZgD/ZjP/Zmb/Zpn/Zsz/Zv//ZgAAmTMA
mWYAmZkAmcwAmf8AmQAzmTMzmWYzmZkzmcwzmf8zmQBmmTNmmWZmmZlmmcxmmf9mmQCZmTOZmWaZ
mZmZmcyZmf+ZmQDMmTPMmWbMmZnMmczMmf/MmQD/mTP/mWb/mZn/mcz/mf//mQAAzDMAzGYAzJkA
zMwAzP8AzAAzzDMzzGYzzJkzzMwzzP8zzABmzDNmzGZmzJlmzMxmzP9mzACZzDOZzGaZzJmZzMyZ
zP+ZzADMzDPMzGbMzJnMzMzMzP/MzAD/zDP/zGb/zJn/zMz/zP//zAAA/zMA/2YA/5kA/8wA//8A
/wAz/zMz/2Yz/5kz/8wz//8z/wBm/zNm/2Zm/5lm/8xm//9m/wCZ/zOZ/2aZ/5mZ/8yZ//+Z/wDM
/zPM/2bM/5nM/8zM///M/wD//zP//2b//5n//8z//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEA
AAAh+QQJCgC5ACwAAAAAMAAtAAcI/wBzCRxIsKDBgwgTKlzIsGHDQBAjSpwY0aHFXIGuadzIseO1
QAAuPvRIciPEkCIVZixJMhArkCkTrmTZMeNLlDELzqRpUuPNnDp51tz4E6jAnUJBAljK1ChGoqyi
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
"""


def bin2str(source_filename, destination_filename):
    """
    Wandelt eine Datei in einen Base64-String um.
    """
    
    base64.encode(file(source_filename, "rb"), file(destination_filename, "wb"))


def str2bin(base64string):
    """
    Wandelt den übergebenen Base64-String wieder zurück und gibt ein 
    StringIO-Objekt zurück.
    """
    
    return StringIO(base64.decodestring(base64string))


class MyFrame(wx.Frame):
    
    def __init__(
        self, parent = None, id = -1, title = "Example", size = wx.Size(550, 420)
    ):
        
        wx.Frame.__init__(self, parent, id, title, size = size)
        
        panel = wx.Panel(self)
        
        vbox_main = wx.BoxSizer(wx.VERTICAL)
        panel.SetSizer(vbox_main)
        
        ani = wx.animate.Animation()
        ani.Load(str2bin(mailsearch_gif))
        
        ani_ctrl = wx.animate.AnimationCtrl(panel, -1, ani)
        ani_ctrl.Play()
        vbox_main.Add(ani_ctrl, 0, wx.ALL, 20)


def main():
    """Testing"""
    
    # Bild in einen base64-codierten String umwandeln und in eine Textdatei
    # schreiben. Dieser kann dann hier im Programm eingesetzt werden.
    
    ##bin2str(r"mailsearch.gif", r"base64.txt")
    
    app = wx.PySimpleApp()
    f = MyFrame()
    f.Center()
    f.Show()
    app.MainLoop()


if __name__ == "__main__":
    main()
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
hmueller
User
Beiträge: 39
Registriert: Montag 27. November 2006, 16:07
Wohnort: Linz, Oberösterreich

Super! Danke für die schnelle und Ausführliche Hilfe!
I must not fear. Fear is the mind-killer. Fear is the little death that brings total obliteration.
I will face my fear. I will permit it to pass over me and through me. And when it has gone past I will turn the inner eye to see its path.
Antworten