我正在使用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)
这里更通用的问题是"如何在循环中选择对象名称"
我整天都没有运气。我不是编程专家,希望这是值得某人的回答。
答案 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小部件创建,这样可以更快地查找。