wx.Sizer und Detach

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hallo!
Wie ihr es sicher aus dem Betreff rauslesen könnt, geht es um wxWidgets/wxPython. Ja, ich habe im IRC gefragt (keine Antwort) und das Mailarchiv durchsucht (ich habe dort nicht gefragt, weil es zu viel Traffic ist).
Folgende Situation:
Ich habe einen BoxSizer in einem BoxSizer und möchte den inneren verstecken (auch mit allen controls drinnen). Nun, ich gehe in einer for schleife die controls durch und nute Show(False). So weit so gut. Nun, aber es gleicht eine lücke im fenster, also nehme ich den äußeren BoxSizer und nutze Remove() um den inneren rauszulöschen. Super! Aber wenn ich versuche den Sizer wieder mit Add() oder Insert() hinzuzufügen dann geht das nicht weil ich statt einem wx.BoxSizer ein wx.PyDeadObject habe. Ich weis auch warum: weil Remove() den Sizer 'destroy()t', aber das will ich nicht. Nun in der wxWidget 2.5.1 Doku steht dass es Detach() gibt, das das gleiche wie Remove ist, nur halt ohne destroy(). Das Problem ist: mein sizer hat kein Detach()! Robin Dunn sagte, dass es ab wxPy version 2.5 Detach geben soll (das habe ich ja!). Hilfe!


Btw: ich hab auch andere dinge versucht, wie sizer.Show(False) aber dann
hängt sich python.

System:
WinXPSP1, Python 2.3.4, wxPython 2.5.1.5u

Was kann ich machen?

grüße,
Leonidas
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Christopy
User
Beiträge: 131
Registriert: Montag 15. Dezember 2003, 22:39

Hi Leonidas
hab mal ein kleines Beispiel gebastelt.
(hab noch die alte wxPython Version... aber vom Prinzip sollte es gehen)

Code: Alles auswählen

from wxPython.wx import *

class MyFrame1(wxFrame):
    
    def __init__(self, *args, **kwds):
        kwds["style"] = wxDEFAULT_FRAME_STYLE
        wxFrame.__init__(self, *args, **kwds)
        self.button_1 = wxButton(self, wxNewId(), "button_1")
        self.button_2 = wxButton(self, wxNewId(), "button_2")
        self.button_3 = wxButton(self, wxNewId(), "button_3")
        self.button_4 = wxButton(self, wxNewId(), "button_4")

        EVT_BUTTON( self, self.button_3.GetId(), self.OnBtn3 )
        EVT_BUTTON( self, self.button_4.GetId(), self.OnBtn4 )
        
        self.SetTitle("Frame 1")    
        self.__do_layout()

    def __do_layout(self):
        self.sizer_1 = wxBoxSizer(wxVERTICAL)
        self.sizer_2 = wxBoxSizer(wxVERTICAL)
        self.sizer_2.Add(self.button_1, 0, 0, 0)
        self.sizer_2.Add(self.button_2, 0, 0, 0)
        self.sizer_1.Add(self.sizer_2, 0, 0, 0)
        self.sizer_1.Add(self.button_3, 0, 0, 0)
        self.sizer_1.Add(self.button_4, 0, 0, 0)
        
        self.SetAutoLayout(1)
        self.SetSizer(self.sizer_1)
        self.sizer_1.Fit(self)
        self.sizer_1.SetSizeHints(self)
        self.Layout()

    def OnBtn3( self, evt ):
        self.sizer_1.Show( self.sizer_2, False )
        self.sizer_1.Layout()
    
    def OnBtn4( self, evt ):
        self.sizer_1.Show( self.sizer_2, True )
        self.sizer_1.Layout()
Antworten