【问题标题】:How to find an item in a panel如何在面板中查找项目
【发布时间】:2014-05-27 21:03:40
【问题描述】:

我正在使用 Python WX 制作一个可能包含 100 个复选框的大型 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)

这里更一般的问题是“如何在循环中选择对象名称”

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

【问题讨论】:

    标签: python python-2.7 user-interface wxpython


    【解决方案1】:

    与其拥有 100 行几乎相同的代码(容易出错、效率低下且没有吸引力),不如将CheckBoxes 实际构建在一个循环中并将它们保存在一个列表中:

    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 处理为字符串表示形式。

    【讨论】:

      【解决方案2】:

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

      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.Checkboxes,每个都有一个唯一的名称。然后您可以使用 wx.FindWindowByName 按名称查找它们。

      您还可以使用名称作为键、值作为 CheckBox 小部件来创建字典,这具有查找速度更快的优势。

      【讨论】:

        猜你喜欢
        • 2015-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-07
        • 1970-01-01
        相关资源
        最近更新 更多