0

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

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

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

非常感谢

4

1 回答 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 方法效果很好。希望这至少可以帮助您入门。

于 2013-07-10T16:20:13.233 回答