Обычно я пытаюсь создать простую панель скрытия и показывать другую при нажатии кнопки, обычно я могу это сделать, если у меня в кадре один размер, но в этом случае у меня есть лента, поэтому у меня есть 2 размера рамка и всякий раз, когда я показываю панель в sizer 2, она перекрывается и показывает, как будто она не принадлежит sizer.
Я набросал простой цветной пример, чтобы воспроизвести проблему, обратите внимание, что при нажатии кнопки синяя панель скрывает желтую, а не заменяет серую.
import wx
class MyForm(wx.Frame):
#----------------------------------------------------------------------
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY, "HomeFinance", size = (1400,700))
self.panel1 = RibbonPanel(self)
self.panel2 = SidePanel(self)
self.panel3 = MainPanel(self)
self.panel4 = NewPanel(self)
self.panel1.SetBackgroundColour(wx.Colour(191, 193, 65))
self.panel2.SetBackgroundColour(wx.Colour(56, 122, 45))
self.panel3.SetBackgroundColour(wx.Colour(77, 84, 96, 0))
self.panel4.SetBackgroundColour(wx.Colour(55, 149, 153, 0))
self.panel4.Hide()
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.hsizer = wx.BoxSizer(wx.HORIZONTAL)
self.sizer.Add(self.panel1, 1, wx.EXPAND)
self.hsizer.Add(self.panel4, 1, wx.EXPAND)
self.hsizer.Add(self.panel3, 1, wx.EXPAND)
self.hsizer.Add(self.panel2, 1, wx.EXPAND)
self.sizer.Add(self.hsizer, 1, wx.EXPAND)
self.Bind(wx.EVT_BUTTON, self.onetimer, self.panel2.m_button1)
self.SetSizer(self.sizer)
self.CenterOnScreen()
self.Show()
def onetimer(self, event):
self.panel3.Hide()
self.panel4.Show()
class RibbonPanel(wx.Panel):
def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.Size(1400, 115), style=wx.TAB_TRAVERSAL,
name=wx.EmptyString):
wx.Panel.__init__(self, parent, id=id, pos=pos, size=size, style=style, name=name)
self.Layout()
class MainPanel(wx.Panel):
def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.Size(1000, 545), style=wx.TAB_TRAVERSAL,
name=wx.EmptyString):
wx.Panel.__init__(self, parent, id=id, pos=pos, size=size, style=style, name=name)
self.Layout()
class SidePanel(wx.Panel):
def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.Size(400, 545), style=wx.TAB_TRAVERSAL,
name=wx.EmptyString):
wx.Panel.__init__(self, parent, id=id, pos=pos, size=size, style=style, name=name)
self.m_button1 = wx.Button(self, wx.ID_ANY, u"MyButton", wx.DefaultPosition, wx.DefaultSize, 0)
self.Layout()
class NewPanel(wx.Panel):
def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.Size(1000, 545), style=wx.TAB_TRAVERSAL,
name=wx.EmptyString):
wx.Panel.__init__(self, parent, id=id, pos=pos, size=size, style=style, name=name)
self.Layout()
# Run the program
if __name__ == "__main__":
app = wx.App(False)
frame = MyForm()
frame.Show()
app.MainLoop()
Синяя панель, как ожидается, заменит серую и будет иметь точно такое же пятно.