wx Layout Problem mit Sizern

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
wolli_j71
User
Beiträge: 1
Registriert: Dienstag 6. Juli 2021, 10:32

Folgendes Problem mit wx und Sizern:
In einem Panel mit 3 vertikal angeordneten Panels (Zuordnung über wx.GridBagSizer ) besteht die Mitte aus 2 nebeneinander angeordenten Panels.
Wenn ich z.B. den Inhalt des linken mittleren Panels ändere, möchte ich gerne, dass die Höhe des gesamten mittleren Panels angepasst wird (ohne jedoch die Breite zu ändern)
Das gelingt mir nicht. Wenn ich ein -Fit- durchführe, werden die Breiten ebenfalls geändert. Die gesamte Höhe der mittleren Spalte bleibt gleich, auch wenn das farbige Panel im Inneren in der Höhe geändert wird.
Das untere (blaue) Panel rückt aber dabei nicht nach oben.
Nachstehender Code zum Problem:
-----------------------------------------------------------------------------------------------

Code: Alles auswählen

import wx
from wx.core import LI_VERTICAL

class MyFrame(wx.Frame):
    def __init__(self, parent=None, title=u'- TEST -'):
        wx.Frame.__init__(self, parent, -1, title=title)
        self.SetMinSize((750,370))                                     # verhindert ein Resize unter diese Werte
       
        self.panel = wx.Panel(self, style=wx.FULL_REPAINT_ON_RESIZE)   # das Panel das alle anderen aufnimmt        
        self.mainSizer = wx.GridBagSizer(5,5)                          # und der zugehörige Main-Sizer
        
        # das obere Panel
        self.pnl1  = wx.Panel(self.panel, size=(-1, 50), style=wx.BORDER_SIMPLE)
        self.pnl1.SetBackgroundColour(wx.Colour("KHAKI"))

        # das linke Panel zur Aufnahme aller links befindlichen widgets
        self.liPnl = wx.Panel(self.panel, size=(350, -1), style=wx.BORDER_SIMPLE)  
        self.liPnl.SetBackgroundColour(wx.Colour("LIME GREEN"))
        txt = "Zeile -1-\nZeile -2-\nZeile -3-\nZeile -4-\nZeile -5-\nZeile -6-\nZeile -7-\nZeile -8-"
        self.t1    = wx.StaticText(self.liPnl, label=txt, style=wx.TE_MULTILINE)
        self.t1.SetFont(wx.Font(wx.FontInfo(12).Bold()))
        self.liSizer = wx.BoxSizer(wx.VERTICAL)
        self.liSizer.Add(self.t1, 1, wx.EXPAND|wx.ALL, 10)
        self.liPnl.SetSizer(self.liSizer)

        # das rechte Panel zur Aufnahme aller rechts befindlichen widgets
        self.rePnl = wx.Panel(self.panel, size=(350, -1), style=wx.BORDER_SIMPLE)
        self.rePnl.SetBackgroundColour(wx.Colour(245,245,150))
        self.t2    = wx.StaticText(self.rePnl, label="das rechte Panel")        
        self.reSizer = wx.BoxSizer(wx.VERTICAL)                        # der zugehörige Sizer
        self.reSizer.Add(self.t2, flag=wx.ALL, border=5)
        self.rePnl.SetSizer(self.reSizer)        

        # eine vertikale Linie zwischen den beiden mittleren Panels
        sl = wx.StaticLine(self.panel,  style=LI_VERTICAL)        
        
        # das untere Panel für die Buttons
        self.btnPnl = wx.Panel(self.panel, size=(-1, 50), style=wx.BORDER_SIMPLE)
        self.btnPnl.SetBackgroundColour(wx.Colour("SKY BLUE"))
        self.btn1   = wx.Button(self.btnPnl,-1,label=u'Liste verkleinern')
        self.Bind(wx.EVT_BUTTON, self.btn1Click, self.btn1)        
        self.btnSizer = wx.BoxSizer(wx.HORIZONTAL)                     # und der zugehörige Sizer
        self.btnSizer.Add(self.btn1, 0, flag=wx.ALL, border=5)
        self.btnPnl.SetSizer(self.btnSizer)

        # ----------- alles zusammensetzen ------------------------------------------------------        
        self.mainSizer.Add(self.pnl1,   pos=(0,0), span=(1,3), flag=wx.EXPAND|wx.LEFT, border=5)
        self.mainSizer.Add(self.liPnl,  pos=(1,0), flag=wx.EXPAND|wx.LEFT, border=5)
        self.mainSizer.Add(sl,          pos=(1,1), flag=wx.EXPAND)
        self.mainSizer.Add(self.rePnl,  pos=(1,2), flag=wx.EXPAND)
        self.mainSizer.Add(self.btnPnl, pos=(2,0), span=(1,3), flag=wx.EXPAND|wx.LEFT, border=5)        
        
        self.panel.SetSizer(self.mainSizer)

    def btn1Click(self, event):
        self.t1.SetLabel("Zeile -1-\nZeile -2-\nZeile -3-\nZeile -4-")
        self.liSizer.Fit(self.liPnl)
        self.reSizer.Fit(self.rePnl)
        self.Layout()

if __name__ == "__main__":
    app = wx.App()
    frame = MyFrame(None)
    frame.Show(True)
    app.MainLoop()
Antworten