2013-07-09 95 views
0

我即將開始製作一個Python(2.7)應用程序 - 使用wx,但即時通訊仍然有一些理論上的前沿,使我對實際成功持懷疑態度。蟒蛇佈局/功能問題

所以下面是幾個問題: 1)我的應用程序將有很多小部件(按鈕,條目,標籤,組合框) - 當用戶調用某些事件時將添加大多數(單擊添加按鈕將創建額外的標籤,條目,組合框和按鈕)。我的問題是,我如何跟蹤這個動態內容,我當然希望有一個刪除選項。我最好的猜測是列表,但即時通訊仍然不知道我該如何處理像組合框+ im有點失去了我怎麼可以刪除一組小部件。 2)對於固定尺寸的框架/面板,哪種小部件貼裝的做法最適合?將手動設置xypos會很好嗎?即使在1)中考慮我的問題 - 主要感興趣的是如果框架中間的東西被刪除,如何處理佈局 - 漏洞不會很好。

非常感謝

回答

0

我會學分級機,如果你要添加和刪除部件。如果您要添加一行小部件,請將所有這些小部件放入自己的sizer中。以下是添加小部件行的示例:

import wx 

######################################################################## 
class MyPanel(wx.Panel): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self, parent): 
     """Constructor""" 
     wx.Panel.__init__(self, parent) 
     self.id = 1 
     self.row_dict = {} 

     self.mainSizer = wx.BoxSizer(wx.VERTICAL) 

     addBtn = wx.Button(self, label="Add") 
     addBtn.Bind(wx.EVT_BUTTON, self.onAdd) 

     self.mainSizer.Add(addBtn, 0, wx.ALL|wx.CENTER, 5) 
     self.SetSizer(self.mainSizer) 

    #---------------------------------------------------------------------- 
    def onAdd(self, event): 
     """ 
     Add row of widgets 
     """ 
     sizer = wx.BoxSizer(wx.HORIZONTAL) 

     label = wx.StaticText(self, label="Test") 
     removeBtn = wx.Button(self, label="Remove row", name=str(self.id)) 
     removeBtn.Bind(wx.EVT_BUTTON, self.onRemove) 

     self.row_dict[str(self.id)] = sizer 

     self.id += 1 

     sizer.Add(label, 0, wx.ALL, 5) 
     sizer.Add(removeBtn, 0, wx.ALL, 5) 
     self.mainSizer.Add(sizer) 
     self.mainSizer.Layout() 

    #---------------------------------------------------------------------- 
    def onRemove(self, event): 
     """ 
     Remove row 
     """ 
     btn = event.GetEventObject() 
     name = btn.GetName() 
     print name 
     print "removing => ", self.row_dict[name] 
     sizer = self.row_dict[name] 
     for child in sizer.GetChildren(): 
      widget = child.GetWindow() 
      print widget 
      sizer.Remove(widget) 

     #self.mainSizer.Remove(self.row_dict[name]) 
     self.mainSizer.Layout() 
     self.Layout() 

######################################################################## 
class MyFrame(wx.Frame): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self): 
     """Constructor""" 
     wx.Frame.__init__(self, None, title="Add Widgets") 
     panel = MyPanel(self) 
     self.Show() 

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

我還沒有能夠使remove方法正常工作,但add方法的效果很好。希望這會幫助你至少開始。