2013-12-19 41 views
0

我是wxPython的新手。我正在使用Gridbagsizer進行佈局。 我幾乎成功地做出了我想要的佈局。但是對於一些未知的問題,它會帶來一些問題。用wxPython替換現有的佈局與新的佈局

我的目標: 我做了5個佈局。綠色,紅色,藍色,黃色和黑色。當我雙擊「This is test run」時,黃色佈局應該完全由黑色佈局取代。

實際發生了什麼: 黃色被黑色取代。沒有問題。但由於某種原因,藍色佈局位置轉移到了底部。

我的代碼是這樣的:

import wx 

class myframe(wx.Frame): 
    def __init__(self): 
     "Constructor. No arguments" 
     wx.Frame.__init__(self, None, size=(1000,700)) 
     self.TitlePanel = wx.Panel(self, size=(350, 400)) 
     self.newPanel = wx.Panel(self, size=(300, 250)) 
     imgPanel = wx.Panel(self, size=(300, 250)) 
     modulePanel=wx.Panel(self, size=(350, 250)) 
     self.TCPanel=wx.Panel(self, size=(300, 250)) 
     ############################################ 
     self.TitlePanel.SetBackgroundColour("green") 
     imgPanel.SetBackgroundColour("red") 
     modulePanel.SetBackgroundColour("blue") 
     self.TCPanel.SetBackgroundColour("yellow") 
     self.newPanel.SetBackgroundColour("black") 
     self.newPanel.Hide() 
     ############################################   
     self.myGridSizer = wx.GridBagSizer(1,1) 
     self.myGridSizer.Add(self.TitlePanel, pos=(0, 0), span=(4,8), flag=wx.EXPAND) 
     self.myGridSizer.Add(imgPanel, pos=(0, 10), span=(4,8), flag=wx.ALL) 
     self.myGridSizer.Add(modulePanel, pos=(10, 0), span=(1,8), flag=wx.ALL) 
     self.myGridSizer.Add(self.TCPanel, pos=(10, 10), span=(4,8), flag=wx.ALL) 
     ############################################# 
     self.text1 = wx.StaticText(self.TitlePanel, label="This is a test run",style=2,size=(350,-1)) 
     font = wx.Font(18, wx.DECORATIVE, wx.ITALIC,wx.BOLD, wx.NORMAL) 
     self.text1.SetFont(font) 
     ############################################# 
     self.SetSizer(self.myGridSizer) 
     self.text1.Bind(wx.EVT_LEFT_DCLICK, self.hideMe) 
     imgPanel.Bind(wx.EVT_LEFT_DCLICK, self.showMe) 
     self.myGridSizer.SetEmptyCellSize((0, 0)) 
    def hideMe(self, event): 
     self.TCPanel.Hide() 
     self.myGridSizer.Add(self.newPanel, pos=(5, 10), span=(4,8), flag=wx.ALL) 
     self.newPanel.Show() 
     self.Layout() 
    def showMe(self, event): 
     print "show!" 
     self.newPanel.Hide() 
     self.TCPanel.Show() 
     self.Layout() 

if __name__ == "__main__": 
    app = wx.App() 
    region = myframe() 
    region.Show() 
    app.MainLoop() 

所以,我如何替換佈局,並保持現有的佈局不變?

+0

請更正您的源代碼的縮進。 – Fenikso

+0

我不知道爲什麼會發生這種情況,我在Ubuntu中編寫了這段代碼,結果很好......但是現在,當我在Windows上運行這個代碼時,文本部分發生了錯誤,無論如何,現在這至少可以成功運行。再次感謝您的回答。 – Sam

回答

1

首先,你應該糾正你text1是如何被控制,相對於它的位置。如果它是TitlePanel的孩子,那麼你應該使用一個新的尺寸爲TitlePanel,並把text1裏面。你的sizer應該遵循父子層次結構。

接下來,僅僅是Hide()Show()是不夠的,您必須正確替換sizer中的元素。最簡單的方法是使用sizer.Replace(old_widget, new_widget)

import wx 
class myframe(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, size=(1000,700)) 

     self.TitlePanel = wx.Panel(self, size=(350, 400)) 
     self.TitlePanel.SetBackgroundColour("green") 

     self.newPanel = wx.Panel(self, size=(300, 250)) 
     self.newPanel.SetBackgroundColour("black") 
     self.newPanel.Hide() 

     self.imgPanel = wx.Panel(self, size=(300, 250)) 
     self.imgPanel.SetBackgroundColour("red") 

     self.modulePanel=wx.Panel(self, size=(350, 250)) 
     self.modulePanel.SetBackgroundColour("blue") 

     self.TCPanel=wx.Panel(self, size=(300, 250)) 
     self.TCPanel.SetBackgroundColour("yellow") 

     self.myGridSizer = wx.GridBagSizer(1,1) 
     self.myGridSizer.SetEmptyCellSize((0, 0)) 
     self.myGridSizer.Add(self.TitlePanel, pos=(0, 0), span=(4,8), flag=wx.EXPAND) 
     self.myGridSizer.Add(self.imgPanel, pos=(0, 10), span=(4,8), flag=wx.ALL) 
     self.myGridSizer.Add(self.modulePanel, pos=(10, 0), span=(1,8), flag=wx.ALL) 
     self.myGridSizer.Add(self.TCPanel, pos=(10, 10), span=(4,8), flag=wx.ALL) 

     self.text1 = wx.StaticText(self.TitlePanel, label="This is a test run",style=2,size=(350,-1)) 
     font = wx.Font(18, wx.DECORATIVE, wx.ITALIC,wx.BOLD, wx.NORMAL) 
     self.text1.SetFont(font) 

     self.titleSizer = wx.BoxSizer() 
     self.titleSizer.Add(self.text1, flag=wx.TOP|wx.LEFT|wx.ALIGN_RIGHT,border=10) 
     self.TitlePanel.SetSizer(self.titleSizer) 

     self.SetSizer(self.myGridSizer) 

     self.text1.Bind(wx.EVT_LEFT_DCLICK, self.hideMe) 
     self.imgPanel.Bind(wx.EVT_LEFT_DCLICK, self.showMe) 


    def hideMe(self, event): 
     self.TCPanel.Hide() 
     self.myGridSizer.Replace(self.TCPanel, self.newPanel) 
     self.newPanel.Show() 
     self.Layout() 

    def showMe(self, event): 
     self.newPanel.Hide() 
     self.myGridSizer.Replace(self.newPanel, self.TCPanel) 
     self.TCPanel.Show() 
     self.Layout() 

if __name__ == "__main__": 
    app = wx.App() 
    region = myframe() 
    region.Show() 
    app.MainLoop() 

另外幾個音符關於你的代碼:

  1. 不要環繞支架與空間。這是醜陋的,反對一般的Python風格。
  2. 不要將局部變量與小部件的對象屬性混合使用。使用一種方法並堅持下去,最好使用對象屬性。這樣你就可以用所有方法訪問你的小部件。
  3. 它通常具有更高的可讀性,可以通過屬性設置等來創建窗口小部件的創建。很難找到哪個窗格是代碼中的哪種顏色。
+0

非常感謝您的回答。我肯定會對您的建議感興趣。 – Sam

+0

不客氣。希望有所幫助。 – Fenikso

+0

請幫我在這http://stackoverflow.com/questions/20696187/layout-management-with-wxpython – Sam