如何在面板中查找项目

时间:2014-05-27 21:03:40

标签: python python-2.7 user-interface wxpython

我正在使用Python WX制作一个包含100个CheckBox的大型GUI。我想读取每个复选框的值,并将这些值附加到列表中。我可以使用100行代码执行此操作,但更喜欢使用循环。在循环中,如何识别或选择我想从中获取值的特定复选框?

self.Box1 = wx.CheckBox(self.panel, id = 1, label='first box', pos=(10, 25), size=(30,22))
self.Box2 = wx.CheckBox(self.panel, id = 2, label='second box', pos=(20, 25), size=(30,22))
          .
          .
          .
self.Box100 = wx.CheckBox(self.panel, id = 100, label='100th box', pos=(100, 25), size=(30,22))

寻找类似的东西:

MyList = []
for N in range (1, 101):
     MyList.append(self.Box + N.Value)

这里更通用的问题是"如何在循环中选择对象名称"

我整天都没有运气。我不是编程专家,希望这是值得某人的回答。

2 个答案:

答案 0 :(得分:2)

实际上在循环中构建CheckBox es并将它们保存在列表中,而不是拥有100条几乎相同的代码行,这些代码行容易出错,效率低且缺乏吸引力:

self.boxes = [] 
for i in range(1, 101):      
    self.boxes.append(wx.CheckBox(self.panel, id=i, 
                                  label="Box {0}".format(i)
                                  pos=(10, 25), size=(30,22)))

然后获取所有值同样简单:

for i, box in enumerate(self.boxes, 1):
    ...

就像访问单个一样:

box = self.boxes[i-1]

如果你真的想要"first""second""100th"编写一个辅助函数来将i处理成字符串表示。

答案 1 :(得分:1)

我个人喜欢使用小部件名称。例如:

import wx

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

    #----------------------------------------------------------------------
    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent)

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

        for i in range(5):
            txt = "Checkbox #%s" % i
            chk = wx.CheckBox(self, label=txt, name=txt)
            self.sizer.Add(chk, 0, wx.ALL|wx.CENTER, 5)

        button = wx.Button(self, label="Get check")
        button.Bind(wx.EVT_BUTTON, self.onButton)
        self.sizer.Add(button, 0, wx.ALL|wx.CENTER, 5)

        self.SetSizer(self.sizer)

    #----------------------------------------------------------------------
    def onButton(self, event):
        """"""
        widget = self.FindWindowByName("Checkbox #0")
        print widget
        print widget.GetValue()

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

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

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

此代码将创建一组包含唯一名称的5个wx.Checkbox。然后,您可以使用 wx.FindWindowByName 按名称查找它们。

您还可以使用名称作为键创建字典,将值作为CheckBox小部件创建,这样可以更快地查找。