我有以下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")
答案 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来放置按钮。当我有一堆按钮会做类似的事情时,我就会这样做。