Seite 1 von 1

wx Layout Problem mit Sizern

Verfasst: Sonntag 1. August 2021, 12:46
von wolli_j71
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()