我正在使用GUI,我想创建一个可变数量的按钮,具体取决于用户输入的内容。我应该怎么做呢?
更准确地说,用户打开一个包含多个数据集N的数据文件。我想用第i个按钮创建N个按钮,其名称为第i个数据集。
类似......(概念上,显然这不起作用)
import wx
# create sizer
hbox1=wx.GridBagSizer(4,4)
# create file button and add to sizer
fbtn = wx.Button(dv, label=file)
hbox1.Add(fbtn, pos=(jf,0))
# read file to get dataset names
dsetnames=[<dataset names for file>]
# create bottons for datasets found in file
jd=0 # datasets
for ds in dsetnames:
self.dbtn<jd> = wx.Button(dv, label=ds)
hbox1.Add(self.dbtn<jd>, pos=(jd,1))
jd+=1
谢谢。
我找到一个解决方案,但我没有权利回答问题,所以我会在这里添加。 通常,这里的解决方案是创建一个字典,其中对象名称作为键,对象作为值。
import wx
dv=wx.Panel(self)
# create sizer
hbox1=wx.GridBagSizer(4,4)
# create file button and add to sizer
# filename file input by user
fbtn = wx.Button(dv, label=file)
hbox1.Add(fbtn, pos=(jf,0))
# read file to get dataset names
dsetnames=[<dataset names for file>]
# create empty dictionary for objects
self.dbtn=dict()
# create bottons for datasets found in file
jd=0 # datasets
for ds in dsetnames:
objname=ds
self.dbtn.update({objname:wx.Button(dv, label=ds)}) # update dictionary with individual objects
hbox1.Add(self.dbtn[objname], pos=(jd,1))
jd+=1
我认为以下内容可能有关。
答案 0 :(得分:0)
我更喜欢使用列表,以便从文件中读取的项目顺序正确。字典没有标准订单,但您可以使用集合库中的OrderedDict。无论如何,这是一种使用列表的方法:
import wx
########################################################################
class MyPanel(wx.Panel):
""""""
#----------------------------------------------------------------------
def __init__(self, parent):
"""Constructor"""
wx.Panel.__init__(self, parent)
btn_list = self.getButtons()
btn_sizer = wx.BoxSizer(wx.VERTICAL)
for index, btn in enumerate(btn_list):
name = "button%i" % index
b = wx.Button(self, label=btn, name=name)
b.Bind(wx.EVT_BUTTON, self.onButton)
btn_sizer.Add(b, 0, wx.ALL|wx.CENTER, 5)
self.SetSizer(btn_sizer)
#----------------------------------------------------------------------
def getButtons(self):
"""
Here you would put code to get a list of button labels from a file
"""
return ["alpha", "bravo", "charlie"]
#----------------------------------------------------------------------
def onButton(self, event):
""""""
btn = event.GetEventObject()
print "The button's label is '%s'" % btn.GetLabel()
print "The button's name is '%s'" % btn.GetName()
########################################################################
class MyFrame(wx.Frame):
""""""
#----------------------------------------------------------------------
def __init__(self):
"""Constructor"""
wx.Frame.__init__(self, None, title="Buttons")
panel = MyPanel(self)
self.Show()
if __name__ == "__main__":
app = wx.App(False)
frame = MyFrame()
app.MainLoop()
您可能会发现以下文章也很有用: