2013-07-09 55 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方法的效果很好。希望这会帮助你至少开始。