wxPython: Bilder anzeigen, löschen, verändern

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Gast

Hallo,
Ich weiß es ist besser pro Thema nur eine Frage zu stellen, aber dann müsste ich gleich 2 Threads eröffnen und irgenwiehängt es ja doch zusammen :) :
Ich bin ein totaler Newbie was wxPyhton betrifft, und eigentlich auch Python im Allgemeien.
Mein Ziel ist es Bilder, die ich mit der PIL bearbeitet habe in einem wxPython-Fenster anzuzeigen. Ich poste mal den Code dieser Klasse:

Code: Alles auswählen


class MainWindow(wxFrame):
    def __init__(self,parent,id,title):
        wxFrame.__init__(self,parent,wxID_ANY, title, size = (600,400),
                                        style=wxDEFAULT_FRAME_STYLE|
                                        wxNO_FULL_REPAINT_ON_RESIZE)
        pil = Image.open("lena.gif")
        pil2 = manipulate(pil)
        b = pilToBitmap(pil)    # gibt ein wxBitmap zurück
        b2 = pilToBitmap(pil2)
        self.sb = wxStaticBitmap(self, ID_SB, b)  # hier mach ich die BMs zum Anzeigen
        self.sb2 = wxStaticBitmap(self, ID_SB2, b2)
        self.button = wxButton(self, ID_BUTTON, "mach")
        EVT_BUTTON(self, ID_BUTTON, self.On1Click)

        self.sizer2=wxBoxSizer(wxHORIZONTAL)
        self.sizer2.Add(self.sb,True,wxEXPAND)
        self.sizer2.Add(self.sb2,True,wxEXPAND)

        self.sizer=wxBoxSizer(wxVERTICAL)
        self.sizer.Add(self.sizer2, False, wxEXPAND)
        self.sizer.Add(self.button, False, wxEXPAND)

        self.SetSizer(self.sizer)
        self.SetAutoLayout(1)
        self.sizer.Fit(self)

        self.Show()

    def On1Click(self, e):
        self.sizer2.Remove(self.sb)  # Hier will ich das angezeigte Bild löschen
        del self.sb2                          # Ist das hier überhaupt nötig?
        self.sizer2.Layout()              # Und das hier?
1) Die erste Verwirrung war: Verwendet man jetzt zum Anzeigen wxStaticBitmap oder nicht. In der Doku steht dazu, dass man sie nur für kleine Icons verwenden soll, aber im Beispiel Image.py benutzen sie wx.StaticBitmap, oder ist das was anderes als wxStaticBitmap? Wenn ich dem Sizer eine wxStaticBitmap anhänge gehts, wenn ich eine wxBitmap angänge krieg ich einen Speicherzugriffsfehler

2) Wie lösche ich ein Bild aus einem Sizer und ersetze es durch ein neues/verändertes? Wenn ich Remove(meineStaticBitmap) nehme, dann ist das Bild zwar nicht mehr im Sizer, wird aber immer noch angezeigt, wie krieg ich das weg? Außerdem steht in der Doku, dass ich lieber Detach() nehmen soll, aber dann sagt er mir, dass wxBoxSizer kein solches Attribut hätte. Außerdem zerstört Detach() das Bild ja nicht, was ich eigentlich ja will.

Wär super wenn mir jemand dabei helfen könnte!
Danke schon im Voraus,
benedikt

EDIT by mawe: code-tags -> python-tags
benedikt
User
Beiträge: 2
Registriert: Donnerstag 3. Februar 2005, 11:36

Also irgendwie komm ich mit dem nicht zurecht :(
Das Probelm mit dem Entfernen hab ich jetzt so gelöst, dass ich einfach das entsprechende wxWindow.Destroy() verwende. Ich weiß nur nicht ob davon der Sizer etwas mitbekommt. Naja, jedenfalls ist es dann weg.

Ich hab nur ein eigenartiges Problem:

Code: Alles auswählen

def toBitmap(self, sequ, width, hight, side):
        pim = Image.new('L', (width*side, hight*side))
##### diverse Bildbearbeitungen ##########

###################################
        pim.show()  # Anschauen obs was geworden ist, "ja"
        print "pim.size " + repr(pim.size) # Passt die Größe, "ja"
        # Zum Konvertieren in eine Bitmap
        image = wxEmptyImage(pim.size[0], pim.size[1])
        image.SetData(pim.convert('RGB').tostring())
        # !!!
        b = wxBitmapFromImage(image) # Genau hier gibt es immer einen Segfault
        return b
Das komische daran ist, dass ich diesen Code aus dem wxPython-Wiki genommen habe, und ich denselben Code auch in einem anderen Programm verwende, wo es funktioniert :?
Was ist hier anders, übersehe ich etwas?
Kann mir wer einen Tipp geben?

Schöne Grüße,
Benedikt
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Hallo Benedikt,

leider habe ich auch keine Antwort auf Deine Frage.

Aber vielleicht stellst Du Deine Frage in die wxPython-user
mailing list (?)
benedikt
User
Beiträge: 2
Registriert: Donnerstag 3. Februar 2005, 11:36

Hallo,
Also das mit dem Segfault ist jetzt nicht mehr aufgetreten, keine Ahnung was das war. Vielleicht auch was ganz anderes, egal es funktioniert.
Das Löschen aus einem Sizer mittels Destroy() ist auch keine so abwegige Methode, wie ich an anderer Stelle gelesen habe, weil es Detach() bei mir nicht gibt und Remove() veraltet ist.
Naja es bedarf wohl noch einiger Einarbeitung, aber soweit bin ich zufrieden ;)
Dann schöne Grüße und bis zum nächsten Mal,
Benedikt
Antworten