2016-05-05 1 views
0

Я хотел бы иметь две (я буду добавлять более поздние) панели, которые занимают одно и то же пространство внутри кадра и для их отображения/скрытия при нажатии соответствующей кнопки на панель инструментов, «mListPanel» должна быть стандартной. В настоящее время панель настроек отображается, когда приложение запущено, и кнопки ничего не делают. Я много часов искал и много пробовал, но до сих пор не могу заставить его работать. Я прошу прощения, если это что-то простое, я только начал изучать питон сегодня.wxPython: Переключение между несколькими панелями с помощью кнопки

Это то, что код выглядит сейчас:

import wx 

    class mListPanel(wx.Panel): 
     def __init__(self, parent): 
      wx.Panel.__init__(self, parent=parent) 
       #wx.StaticText(self, -1, label='Search:')#, pos=(10, 3)) 
       #wx.TextCtrl(self, pos=(10, 10), size=(250, 50)) 

    class settingsPanel(wx.Panel): 
     def __init__(self, parent): 
      wx.Panel.__init__(self, parent=parent) 

    class bifr(wx.Frame): 
     def __init__(self): 
      wx.Frame.__init__(self, None, wx.ID_ANY, "Title") 

      self.listPanel = mListPanel(self) 
      self.optPanel = settingsPanel(self) 

      menuBar = wx.MenuBar() 
      fileButton = wx.Menu() 
      importItem = wx.Menu() 
      fileButton.AppendMenu(wx.ID_ADD, 'Add M', importItem) 
      importItem.Append(wx.ID_ANY, 'Import from computer') 
      importItem.Append(wx.ID_ANY, 'Import from the internet') 
      exitItem = fileButton.Append(wx.ID_EXIT, 'Exit') 
      menuBar.Append(fileButton, 'File') 
      self.SetMenuBar(menuBar) 
      self.Bind(wx.EVT_MENU, self.Quit, exitItem) 

      toolBar = self.CreateToolBar() 
      homeToolButton = toolBar.AddLabelTool(wx.ID_ANY, 'Home', wx.Bitmap('icons/home_icon&32.png')) 
      importLocalToolButton = toolBar.AddLabelTool(wx.ID_ANY, 'Import from computer', wx.Bitmap('icons/comp_icon&32.png')) 
      importToolButton = toolBar.AddLabelTool(wx.ID_ANY, 'Import from the internet', wx.Bitmap('icons/arrow_bottom_icon&32.png')) 
      settingsToolButton = toolBar.AddLabelTool(wx.ID_ANY, 'settings', wx.Bitmap('icons/wrench_plus_2_icon&32.png')) 
      toolBar.Realize() 

      self.Bind(wx.EVT_TOOL, self.switchPanels(), settingsToolButton) 
      self.Bind(wx.EVT_TOOL, self.switchPanels(), homeToolButton) 
      self.Layout() 

     def switchPanels(self): 
      if self.optPanel.IsShown(): 
       self.optPanel.Hide() 
       self.listPanel.Show() 
       self.SetTitle("Home") 
      elif self.listPanel.IsShown(): 
       self.listPanel.Hide() 
       self.optPanel.Show() 
       self.SetTitle("Settings") 
      else: 
       self.SetTitle("Error") 
      self.Layout() 

     def Quit(self, e): 
      self.Close() 

    if __name__ == "__main__": 
     app = wx.App(False) 
     frame = bifr() 
     frame.Show() 
     app.MainLoop() 

ответ

0

Во-первых, я настоятельно рекомендую, чтобы вы узнали о wxpython sizers и получить хорошее представление о них (они на самом деле не так уж тяжела понять) как можно скорее, прежде чем углубиться в wxpython, просто дружественный совет :).

как для вашего примера, несколько вещей: , когда вы не используете sizers, вы должны указать размер и положение для каждого окна, иначе они просто не будут отображаться, поэтому вам придется менять классы панелей на что-то вроде этого (опять же это только для демонстрации, вы должны делать это с wx.sizers, а не положение и размер):

class mListPanel(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent=parent,pos=(0,100),size=(500,500)) 

class settingsPanel(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent=parent,pos=(0,200),size (1000,1000)) 

еще более, когда связывание событие должно выглядеть следующим образом:

self.Bind(wx.EVT_TOOL, self.switchPanels, settingsToolButton) 
self.Bind(wx.EVT_TOOL, self.switchPanels, homeToolButton) 

Обратите внимание, что я написал только имя функция без добавленного(), когда событие передается ему, вы не можете вводить свои собственные параметры функции, испускаемой из события (если вы не делаете это со следующим синтаксисом лямбда e: FooEventHandler (paramators))

и обработчик событий (функция) должен выглядеть следующим образом:

def switchPanels(self, event): 
    if self.optPanel.IsShown(): 
     self.optPanel.Hide() 
     self.listPanel.Show() 
     self.SetTitle("Home") 
    elif self.listPanel.IsShown(): 
     self.listPanel.Hide() 
     self.optPanel.Show() 
     self.SetTitle("Settings") 
    else: 
     self.SetTitle("Error") 
    self.Layout() 

всегда должна быть вторым параметром рядом с себя функциями, которые связываются с событием, как объект события проходит там, и вы можете найти связанные с ним методы и параметры в документации (в этом примере это wx.EVT_TOOL).