Hier ein kleines Beispiel. Allerdings ist es kaum möglich, im Panel ``LeftBottomPanel`` die Boxen exakt unter die gewünschten Spalten zu stellen. Da würde ich eher das ``FlexGrid`` innerhalb des Panels ``LeftTopPanel`` so erweitern, dass die Boxen unterhalb angezeigt werden. Allerdings müsstest du dann auf die verschiedenen Farben, die derzeit unter den Feldern liegen, verzichten. Was aber ein geringer Preis dafür ist.
Ich habe jetzt drei Stunden herumprobiert um herauszufinden, wie man am Besten die Spalten, in zwei verschiedenen Panels, untereinander ausrichten könnte. Dabei habe ich mindestens vier verschiedene Wege (über Timer, über eigene Events, über Eventweiterleitung, mit Sizer, ohne Sizer, usw.) ausprobiert und nichts hat so funktioniert, dass ich es jemandem raten könnte.
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
import wx
class MyFrame(wx.Frame):
"""
Hauptframe
"""
def __init__(self, parent = None, id = -1, title = "Hauptframe"):
"""
Initialisiert das Frame und baut es auf
"""
wx.Frame.__init__(self, parent, id, title)
# Panel
panel = wx.Panel(self)
# Haupt-Sizer
gbag = wx.GridBagSizer(vgap = 2, hgap = 2)
gbag.AddGrowableCol(0)
gbag.AddGrowableCol(1)
gbag.AddGrowableRow(0)
gbag.AddGrowableRow(1)
panel.SetSizer(gbag)
# LeftTopPanel
left_top_panel = LeftTopPanel(panel)
gbag.Add(item = left_top_panel, pos = (0, 0), flag = wx.EXPAND)
# LeftBottomPanel
left_bottom_panel = LeftBottomPanel(panel)
gbag.Add(item = left_bottom_panel, pos = (1, 0), flag = wx.EXPAND)
# RightPanel
right_panel = RightPanel(panel)
gbag.Add(item = right_panel, pos = (0, 1), span = (2, 1), flag = wx.EXPAND)
# Zentrieren und anzeigen
if parent:
self.CenterOnParent(parent)
else:
self.Center()
self.Show()
# ** auf das Mindestmaß verkleinern**
# Dazu wird zuerst das Panel auf das Minimum verkleinert.
panel.Fit()
# Dann wird die ClientSize des Frames an die Größe des Panels angepasst
self.SetClientSize(panel.GetSizeTuple())
# Danach noch die Mindestgröße des Frames auf die aktuelle Größe des Frames setzen.
self.SetSizeHintsSz(self.GetSizeTuple())
class LeftTopPanel(wx.Panel):
"""
Panel, welches links oben angezeigt wird.
"""
def __init__(self, parent = None):
"""
Initialisiert das Panel
"""
wx.Panel.__init__(self, parent)
self.SetBackgroundColour("blue")
# VBox (für den äußeren Abstand)
vbox_out = wx.BoxSizer(wx.VERTICAL)
self.SetSizer(vbox_out)
# Panel
panel = wx.Panel(self)
panel.SetBackgroundColour("#ccddee")
vbox_out.Add(item = panel, proportion = 1, flag = wx.ALL | wx.EXPAND, border = 10)
# VBox (für den inneren Abstand)
vbox_in = wx.BoxSizer(wx.VERTICAL)
panel.SetSizer(vbox_in)
# FlexGrid
fgrid = wx.FlexGridSizer(rows = 4, cols = 4, vgap = 5, hgap = 5)
self.fgrid = fgrid # veröffentlichen, um als Referenz-Sizer dienen zu können
for i in range(1, 4):
fgrid.AddGrowableCol(i)
fgrid.AddGrowableRow(i)
vbox_in.Add(fgrid, 1, flag = wx.ALL | wx.EXPAND, border = 5)
# **Erste Zeile**
# Leerzelle
fgrid.Add(item = (0, 0))
# Montag
fgrid.Add(wx.StaticText(panel, -1, label = "Montag"), flag = wx.ALIGN_CENTER_VERTICAL)
# ...
fgrid.Add(wx.StaticText(panel, -1, label = "..."), flag = wx.ALIGN_CENTER_VERTICAL)
# Sonntag
fgrid.Add(wx.StaticText(panel, -1, label = "Sonntag"), flag = wx.ALIGN_CENTER_VERTICAL)
# **Zweite Zeile**
# Vormittag
fgrid.Add(wx.StaticText(panel, -1, label = "Vormittag"), flag = wx.ALIGN_CENTER_VERTICAL)
# Montag
choices = ("Hallo", "Welt")
ch_vormittag_montag = wx.Choice(panel, -1, choices = choices)
fgrid.Add(ch_vormittag_montag, flag = wx.ALIGN_CENTER_VERTICAL)
# ...
choices = ("Hallo", "Welt")
ch_vormittag_punktpunkt = wx.Choice(panel, -1, choices = choices)
fgrid.Add(ch_vormittag_punktpunkt, flag = wx.ALIGN_CENTER_VERTICAL)
# Sonntag
choices = ("Hallo", "Welt")
ch_vormittag_sonntag = wx.Choice(panel, -1, choices = choices)
fgrid.Add(ch_vormittag_sonntag, flag = wx.ALIGN_CENTER_VERTICAL)
# **Dritte Zeile**
# Mittag
fgrid.Add(wx.StaticText(panel, -1, label = "Mittag"), flag = wx.ALIGN_CENTER_VERTICAL)
# Montag
choices = ("Hallo", "Welt")
ch_mittag_montag = wx.Choice(panel, -1, choices = choices)
fgrid.Add(ch_mittag_montag, flag = wx.ALIGN_CENTER_VERTICAL)
# ...
choices = ("Hallo", "Welt")
ch_mittag_punktpunkt = wx.Choice(panel, -1, choices = choices)
fgrid.Add(ch_mittag_punktpunkt, flag = wx.ALIGN_CENTER_VERTICAL)
# Sonntag
choices = ("Hallo", "Welt")
ch_mittag_sonntag = wx.Choice(panel, -1, choices = choices)
fgrid.Add(ch_mittag_sonntag, flag = wx.ALIGN_CENTER_VERTICAL)
# **Vierte Zeile**
# Nachmittag
fgrid.Add(wx.StaticText(panel, -1, label = "Nachmittag"), flag = wx.ALIGN_CENTER_VERTICAL)
# Montag
choices = ("Hallo", "Welt")
ch_nachmittag_montag = wx.Choice(panel, -1, choices = choices)
fgrid.Add(ch_nachmittag_montag, flag = wx.ALIGN_CENTER_VERTICAL)
# ...
choices = ("Hallo", "Welt")
ch_nachmittag_punktpunkt = wx.Choice(panel, -1, choices = choices)
fgrid.Add(ch_nachmittag_punktpunkt, flag = wx.ALIGN_CENTER_VERTICAL)
# Sonntag
choices = ("Hallo", "Welt")
ch_nachmittag_sonntag = wx.Choice(panel, -1, choices = choices)
fgrid.Add(ch_nachmittag_sonntag, flag = wx.ALIGN_CENTER_VERTICAL)
class LeftBottomPanel(wx.Panel):
"""
Panel, welches links unten angezeigt wird.
"""
def __init__(self, parent):
"""
Initialisiert das Panel
"""
wx.Panel.__init__(self, parent)
self.SetBackgroundColour("red")
class RightPanel(wx.Panel):
"""
Panel, welches rechts angezeigt wird.
"""
def __init__(self, parent = None):
"""
Initialisiert das Panel
"""
wx.Panel.__init__(self, parent)
self.SetBackgroundColour("yellow")
def main():
"""
Hauptprozedur
"""
app = wx.PySimpleApp()
myframe = MyFrame()
app.MainLoop()
if __name__ == "__main__":
main()