Navegando por allí encontré otro ejemplo de barra de herramientas con botones y cambio de paneles.
Lo pego acá por si a alguien le sirve de referencia.
Ya que estamos, en este nuevo ejemplo el programador opta por "destruir" el panel que deja de estar activo. Más allá de que en algunos casos podría no ser necesario (por ejemplo si volvemos a llamar a un botón de la toolbar queremos que el panel vuelva en el mismo estado en que lo dejamos) supongo que se hace por un tema de ahorro de memoria no? es decir, no dejar abiertas cosas que ya no usamos?
Código Python:
Ver originalimport wx
ID_RED = wx.NewId()
ID_BLUE = wx.NewId()
class MyFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, title="Test")
# Attributes
self.panel = MainPanel(self)
# Setup
toolbar = wx.ToolBar(self)
bmp = wx.ArtProvider.GetBitmap(wx.ART_INFORMATION, wx.ART_TOOLBAR)
toolbar.AddTool(ID_RED, bmp, shortHelpString="Red Panel")
toolbar.AddTool(ID_BLUE, bmp, shortHelpString="Blue Panel")
toolbar.Realize()
self.SetToolBar(toolbar)
# Event Handlers
self.Bind(wx.EVT_TOOL, self.OnTool, id=ID_RED)
self.Bind(wx.EVT_TOOL, self.OnTool, id=ID_BLUE)
def OnTool(self, evt):
e_id = evt.GetId()
if e_id == ID_RED:
self.panel.SetPanel("RED")
elif e_id == ID_BLUE:
self.panel.SetPanel("BLUE")
else:
evt.Skip()
class MainPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
# Attributes
self.sizer = wx.BoxSizer()
self.panel = wx.Panel(self)
# Setup
self.panel.SetBackgroundColour(wx.BLACK)
self.sizer.Add(self.panel, 1, wx.EXPAND)
self.SetSizer(self.sizer)
def SetPanel(self, ptype):
if ptype == "RED":
newpanel = wx.Panel(self)
newpanel.SetBackgroundColour(wx.RED)
self.sizer.Replace(self.panel, newpanel)
self.panel.Destroy()
self.panel = newpanel
self.Layout()
elif ptype == "BLUE":
newpanel = wx.Panel(self)
newpanel.SetBackgroundColour(wx.BLUE)
self.sizer.Replace(self.panel, newpanel)
self.panel.Destroy()
self.panel = newpanel
self.Layout()
else:
pass
if __name__ == '__main__':
app = wx.App(False)
frame = MyFrame(None)
frame.Show()
app.MainLoop()