2016-05-05 148 views
0

我希望在框架中佔據相同空間的兩個面板(我將在後面添加更多面板),並在按下各個按鈕時顯示/隱藏面板工具欄,「mListPanel」應該是默認的。目前,啓動應用程序並且按鈕不執行任何操作時會顯示設置面板。我搜索了幾個小時,並嘗試了很多東西,仍然無法使其工作。我很抱歉,如果這很簡單,我今天才開始學習python。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) 

請注意我是如何寫出只有函數沒有添加(),因爲一個事件傳遞給它,你不能輸入你自己的參數到一個事件發出的函數(除非你用下面的語法lambda e:FooEventHandler(paramaters))做它

和事件處理(功能)應該是這樣的:

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)。