在Python中通过objN创建对象obj0,用于任意N?

在Python中通过objN创建对象obj0,用于任意N?,python,wxpython,Python,Wxpython,我正在开发一个GUI,我想根据用户输入的内容创建一个数量可变的按钮。我该怎么做 更准确地说,用户打开一个包含多个数据集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(fbt

我正在开发一个GUI,我想根据用户输入的内容创建一个数量可变的按钮。我该怎么做

更准确地说,用户打开一个包含多个数据集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
多谢各位

我找到了一个解决方案,但我还没有回答问题的特权,所以我将把它添加到这里。 通常,这里的解决方案是创建一个字典,对象名作为键,对象作为值

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
我相信以下可能是相关的


我更喜欢使用列表,以便从文件中读取的项目顺序正确。字典没有标准的顺序,尽管您可以使用集合库中的。无论如何,这里有一种使用列表的方法:

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()
您可能会发现以下文章也很有帮助:


使用按钮对象列表谢谢,我不知道这也是一个选项。