Dialog Layout-Probleme

Plattformunabhängige GUIs mit wxWidgets.
Antworten
BW
User
Beiträge: 25
Registriert: Dienstag 20. März 2007, 10:25

Hallo zusammen,

ich habe da ein kleines Problemchen.
Hier zuerst mal eine kleine Beschreibung und weiter unten dann ein wenig Python. Das Original ist viel zu verschachtelt, deshalb habe ich das ganze mal auf ein Minibeispiel heruntergebrochen.

Ich habe einen "MainDialog" (hier im Bsp. nur 2 Buttons) und dann noch einen "Erweitert-Dialog" (zum Spaß ein wenig Text in einem Sizer (1) und dann noch Radiobuttons in einem zweiten Sizer (2)).
Den "Erweitert-Dialog" muss ich schon in der init des MainDialogs initialisieren, stelle ihn aber noch nicht dar. Wenn jetzt der Button 1 gedrückt wird, soll der Erweitert Dialog dargestellt werden und dann aber nur der Sizer (1). Bei Button 2 soll entsprechend nur Sizer (2) dargestellt werden. Das klappt auch, aber jetzt hätte ich auch noch gerne, dass sich der gesamte Dialog verkleinert. Und genau das bekomme ich nicht hin. Ich denke, dass die Ursache in der "frühen" Initialisierung liegt.
Ich kann leider nicht die betreffenden Sizer schon beim Initialisieren löschen, denn der User kann sie eventuell durch Events sich anzeigen lassen.

So dann mal hier vom Prinzip wie das ganze bis jetzt aussieht. (das ganze unter Windows XP, mit Python 2.5 und wxWidgets 2.8.2)

Code: Alles auswählen

import wx

class DialogMain(wx.Dialog):
    def __init__(self, parent, id, title,
        pos = wx.DefaultPosition, size = wx.DefaultSize,
        style = wx.DEFAULT_DIALOG_STYLE ):
        wx.Dialog.__init__(self, parent, id, title, pos, size, style)
        
        self.anzeigen = 1
        
        item0 = wx.BoxSizer( wx.VERTICAL )
    
        item1 = wx.Button( self,-1, "Button 1", wx.DefaultPosition, wx.DefaultSize, 0 )
        item0.Add( item1, 0, wx.ALIGN_CENTER|wx.ALL, 5 )

        item2 = wx.Button( self,-1, "Button 2", wx.DefaultPosition, wx.DefaultSize, 0 )
        item0.Add( item2, 0, wx.ALIGN_CENTER|wx.ALL, 5 )
        
        self.SetSizer(item0)
        item0.SetSizeHints( self )
        
        # PanelErweitert initialisieren, aber noch nicht darstellen
        self.erweitert = DialogErweitert(self,-1,"ew")
        
        wx.EVT_BUTTON(self, item1.GetId(), self.OnButton1)
        wx.EVT_BUTTON(self, item2.GetId(), self.OnButton2)
        
        self.TransferDataToWindow()
    
    def OnButton1(self, event):
        self.anzeigen = 1
        self.TransferDataToWindow()        
        self.erweitert.ShowModal()   
        
    def OnButton2(self, event):
        self.anzeigen = 2
        self.TransferDataToWindow()        
        self.erweitert.ShowModal()
    
    def TransferDataToWindow(self):
        if self.anzeigen == 1:
            self.erweitert.GetSizer().Show(self.erweitert.SIZER_1, True, True)
            self.erweitert.GetSizer().Show(self.erweitert.SIZER_2, False, True)
            
        if self.anzeigen == 2:
            self.erweitert.GetSizer().Show(self.erweitert.SIZER_1, False, True)
            self.erweitert.GetSizer().Show(self.erweitert.SIZER_2, True, True)
    

class DialogErweitert(wx.Dialog):
    def __init__(self, parent, id, title,
        pos = wx.DefaultPosition, size = wx.DefaultSize,
        style = wx.DEFAULT_DIALOG_STYLE ):
        wx.Dialog.__init__(self, parent, id, title, pos, size, style)
        
        item0 = wx.BoxSizer( wx.VERTICAL )
    
        item1 = wx.BoxSizer( wx.HORIZONTAL )
        self.SIZER_1 = item1
        
        item2 = wx.StaticText( self, -1, "text", wx.DefaultPosition, wx.DefaultSize, 0 )
        item1.Add( item2, 0, wx.ALIGN_CENTER|wx.ALL, 5 )

        item3 = wx.StaticText( self, -1, "text", wx.DefaultPosition, wx.DefaultSize, 0 )
        item1.Add( item3, 0, wx.ALIGN_CENTER|wx.ALL, 5 )

        item0.Add( item1, 0, wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 )

        item4 = wx.FlexGridSizer( 0, 2, 0, 0 )
        self.SIZER_2 = item4
        
        item5 = wx.RadioButton( self, -1, "Radio", wx.DefaultPosition, wx.DefaultSize, 0 )
        item4.Add( item5, 0, wx.ALIGN_CENTER|wx.ALL, 5 )

        item6 = wx.RadioButton( self, -1, "Radio", wx.DefaultPosition, wx.DefaultSize, 0 )
        item4.Add( item6, 0, wx.ALIGN_CENTER|wx.ALL, 5 )

        item7 = wx.RadioButton( self, -1, "Radio", wx.DefaultPosition, wx.DefaultSize, 0 )
        item4.Add( item7, 0, wx.ALIGN_CENTER|wx.ALL, 5 )

        item8 = wx.RadioButton( self, -1, "Radio", wx.DefaultPosition, wx.DefaultSize, 0 )
        item4.Add( item8, 0, wx.ALIGN_CENTER|wx.ALL, 5 )

        item0.Add( item4, 0, wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 )
        
        self.SetSizer(item0)
        item0.SetSizeHints( self )

if __name__ == "__main__":
    app = wx.PySimpleApp()
    frm = wx.Frame(None,-1,"test")
    frm.CentreOnScreen(wx.BOTH)
    frm.Show()
    pnl = DialogMain(frm,-1,"bla")  
    pnl.ShowModal() 
    app.MainLoop() 
Ich habe so diverse Dinge mit dem Sizer und dem Window versucht, aber ohne Erfolg. Der Dialog ändert einfach seine Größe überhaupt nicht.
So langsam kommen mir Zweifel, ob das so überhaupt funktioniert, deshalb bin ich über jeden Hinweis sehr dankbar.

noch einen schönen Abend
Barbara
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

BW hat geschrieben:So langsam kommen mir Zweifel, ob das so überhaupt funktioniert
Hallo Barbara!

1.) Ja das würde funktionieren. Du musst nur in der Methode ``TransferDataToWindow`` als letzte Zeile ``self.erweitert.Fit()`` hin schreiben.

2.) Aber das ist ein Weg der in's totale Chaos führen kann. Ideal wäre, wenn du den Dialog erst dann initialisierst, wenn du diesen brauchst. Beim Initialisieren könntest du ja alle Daten übergeben. Evtl. könntest du dann auch auf die Spielerei mit den zwei Sizern verzichten und zwei Dialoge daraus machen. Du könntest aber auch zwei Panel vorbereiten und je nach auswahl den gewünschten Panel initialisieren und im Dialog anzeigen.

<klugscheißermodus>
Irgendwann ist dein Programm so verwoben, dass es sich nicht mehr weiterentwickeln lässt. Versuche einzelne Teile zu kapseln. Direkt von einem Frame aus so intensiv auf den Dialog zuzugreifen ist genau das Gegenteil. ;-) Aber wenn es nicht anders geht, dann bleibt einem nichts anderes übrig. Ich kenne ja dein Programm nicht.
</klugscheißermodus>

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BW
User
Beiträge: 25
Registriert: Dienstag 20. März 2007, 10:25

Moin Gerold,

Danke für deine Hilfe. Es klappt zwar gerade noch nicht in der "realen" Anwendung, sondern eben nur in diesem Beispiel, aber es geht und dann werde ich jetzt sicherlich auch die Stelle finden, warum es in der "realen" Anwendung bis jetzt nicht funktioniert. In der realen Anwendung befindet sich diese diversen Sizer in verschiedenen Seiten eines Notebooks. Ich hoffe mal, dass nicht gerade dort die Ursache zu finden ist. Ich mach mich mal auf die Suche.

Ich werde auch mal deinem zweiten Hinweis nachgehen.
Ich sollte vielleicht dazusagen, dass ich "nur" an dem GUI weiterarbeite und schon andere ihren Senf dazubeigetragen haben. Ist also irgendwie ein lustiger Brei mit unterschiedlichen Ansätzen und Vorgehensweisen, was die Sache irgendwie nicht einfacher macht. Aber das wird schon :D .

viele Grüße
Barbara
Antworten