python布局/功能问题

时间:2013-07-09 21:10:52

标签: python wxpython wxwidgets

我即将开始制作一个python(2.7)应用程序 - 使用wx,但我仍然面前有一些理论墙,让我对实际成功持怀疑态度。

以下是几个问题: 1)我的应用程序将有许多小部件(按钮,条目,标签,组合框) - 当用户调用某些事件时,大多数将被添加(单击添加按钮将创建其他标签,条目,组合框和按钮)。我的问题是,如何跟踪这个动态内容,我肯定希望有一个删除选项。我最好的猜测是列表,但是我仍然不确定如何处理类似于组合框的东西+我有点失去了如何删除一组小部件。

2)小部件放置的哪种做法最适合固定尺寸的框架/面板?手动设置xypos会不会很好?即使考虑我在1)中的问题 - 主要感兴趣的是如果框架中间的东西被删除,如何处理布局 - 孔不会很好。

非常感谢

1 个答案:

答案 0 :(得分:0)

如果您要添加和删除小部件,我会学习大小调整器。如果您要添加一行小部件,那么将所有这些小部件放在他们自己的大小调整器中。这是添加小部件行的示例:

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方法效果很好。希望这将有助于您至少开始。