2014-09-09 1 views
0

Я работаю над графическим интерфейсом, и я хотел бы создать переменное количество кнопок, в зависимости от того, что вводит пользователь. Как мне это сделать?Создание объектов obj0 через objN в Python, для произвольного N?

Точнее, пользователь открывает файл данных с набором наборов данных N. Я хотел бы создать кнопки N с i-й кнопкой, имеющей имя 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 

Спасибо.

Я нашел a решение, но у меня нет права еще отвечать на вопросы, поэтому я добавлю его здесь. Как правило, решение здесь заключается в создании словаря с именами объектов в качестве ключей и объектов в качестве значений.

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 

Я считаю, что это может быть связано.

Create Hash for Arbitrary Objects?

+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() 

Вы можете найти следующие статьи полезны также:

+0

Спасибо Я не понимал, что это тоже вариант. – jpf

Смежные вопросы