在名称中创建具有连续整数的多个按钮

时间:2010-07-12 18:59:49

标签: python wxpython

我有以下python代码,我想知道是否可以在for循环中创建这些按钮?我正在考虑修改本地命名空间,但我不确定这是不是一个好主意。我真的希望按钮被命名,以便它连续命名。

self.todo1 = wx.TextCtrl(self, -1, "")
self.timer_label1 = wx.StaticText(self, -1, "00:00")
self.set_timer1 = wx.Button(self, -1, "Set Timer")
self.todo2 = wx.TextCtrl(self, -1, "")
self.timer_label2 = wx.StaticText(self, -1, "00:00")
self.set_timer2 = wx.Button(self, -1, "Set Timer")
self.todo3 = wx.TextCtrl(self, -1, "")
self.timer_label3 = wx.StaticText(self, -1, "00:00")
self.set_timer3 = wx.Button(self, -1, "Set Timer")
self.todo4 = wx.TextCtrl(self, -1, "")
self.timer_label4 = wx.StaticText(self, -1, "00:00")
self.set_timer4 = wx.Button(self, -1, "Set Timer")
self.todo5 = wx.TextCtrl(self, -1, "")
self.timer_label5 = wx.StaticText(self, -1, "00:00")
self.set_timer5 = wx.Button(self, -1, "Set Timer")

4 个答案:

答案 0 :(得分:3)

我认为内置的setattr方法可能是您最好的朋友。这样的事情应该有效:

for i in range(1,6):
   setattr(self,'todo%d' % i,wx.TextCtrl(self, -1, ""))
   setattr(self,'timer_label%d' % i, wx.StaticText(self,-1,"00:00"))
   setattr(self,'set_timer%d' % i, wx.Button(self,-1,"Set Timer"))

请记住:

object.x = y

与做:

相同

setattr(object,'x',y)

希望有所帮助!

答案 1 :(得分:2)

使用词典:

self.set_timer = {} 
self.timer_label = {}
self.text_timer = {}

for i in range(1,5):
    self.text_timer[i] = wx.TextCtrl(self, -1, "")
    self.timer_label[i] = wx.StaticText(self, -1, "00:00")
    self.set_timer[i] = wx.Button(self, -1, "Set Timer")

答案 2 :(得分:0)

我建议不要这样做。相反,一种简单且可扩展的方法是为每个计时器对象创建一个类。查看问题中隐含的功能,您将需要正确显示时间,重置它,从文本控制中获取输入等,如果您将所有这些封装在一起,您的代码将更容易维护一个类,而不是通过名称中的整数区分的许多命名变量。这是一个例子。

class TimerCtrl(object):
    def __init__(self, parent, label_number):
        self.todo = wx.TextCtrl(parent, -1, "")
        self.timer_label = wx.StaticText(parent, -1, "00:00")
        self.button = wx.Button(parent, -1, "Set Timer %i" % label_number)
        self.label_number = label_number

# and then in your other class, which I assume is some type of wx.Window
self.timer_controls = []
for i in range(5):
    self.timer_controls.append( TimerCtrl(self, i+1) )

请注意,我没有尝试巧妙地对TimerCtrl实例进行索引,而是我只是将它们全部收集起来 - 聪明的索引打破更容易,通常不值得麻烦。而是找到让对象为你工作的方法。此外,您可能希望TimerCtrl继承自wx.Panel或某些此类内容。

答案 3 :(得分:0)

就个人而言,我会做这样的事情:

----------------------------------------------------------------------

def btnBuilder(): """""" btnNum = 1 for btn in range(5): btn = wx.Button(panel, "Set Timer", name="set_timer%s" % btnNum) btn.Bind(wx.EVT_BUTTON, self.onButton) btnNum += 1

----------------------------------------------------------------------

def onButton(self, event): """""" btn = event.GetEventObject() btnName = btn.GetName() if btnName == "set_timer1": # do something

如果需要,可以在第一个函数中添加一个按钮编号参数甚至是一个sizer来放置按钮。当我有一堆按钮会做类似的事情时,我就会这样做。


迈克·德里斯科尔

博客:http://blog.pythonlibrary.org