创建多个名称带连续整数的按钮
我有一段Python代码,我在想是否可以用一个循环来创建那些按钮?我考虑过修改本地命名空间,但不太确定这样做是否合适。我希望这些按钮的名字能够按顺序命名。
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
我不建议这样做。相反,一个简单且易于扩展的方法是为每个计时器对象创建一个类。根据你问题中隐含的功能,你可能想要正确显示时间、重置计时器、从文本框获取输入等等。如果把这些功能都放在一个类里,而不是用很多通过数字区分的变量名来管理,你的代码会更容易维护。下面是一个例子。
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 或类似的东西。
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")
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)
是一样的。
希望这能帮到你!