wxpython在for循环中启动多个计时器

wxpython在for循环中启动多个计时器,python,loops,timer,wxpython,Python,Loops,Timer,Wxpython,我想在for循环中创建并启动多个计时器。我的做法如下: import wx trials = range(1, 3) timers = range(7) name = 'timer' class TimersClass(wx.Frame): def __init__(self, *args, **kwargs): wx.Frame.__init__(self, *args, **kwargs) panel = wx.Panel(self) self.

我想在for循环中创建并启动多个计时器。我的做法如下:

import wx

trials = range(1, 3)
timers = range(7)
name = 'timer'

class TimersClass(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)

    panel = wx.Panel(self)
    self.button1 = wx.Button(panel, label = 'Go')
    self.Bind(wx.EVT_BUTTON, self.Timers, self.button1)

    def Timers(self, event):
        for trial in trials:
            for timer in timers:
                setattr(self, name + str(timer) + '_' + 'iteration' + str(trial), wx.Timer(self))
                print name + str(timer) + '_' + 'iteration' + str(trial)

                eval(name + str(timer) + '_' + 'iteration' + str(trial) + '.Start(' + str(timer * 1000, ) + ', OneShoot = True)')

        self.Bind(wx.EVT_TIMER, self.Hi)

    def Hi(self, event):
        print 'Hi, bastard!'


app = wx.App()
frame = TimersClass(None)
frame.Center()
frame.Show()

app.MainLoop()
但似乎未创建self.timers对象:

回溯最近一次呼叫上次: 文件Escritorio/iteration_timers.py,第24行,在timers中 evalname+strtimer+''''+'迭代'+strtrial+'.开始'+strtimer*1000,+',oneshot=True' 文件,第1行,在 NameError:未定义名称“timer0\u iteration1”

有人知道为什么这段代码不运行,或者有其他方法吗


非常感谢

我建议在类中使用合理的结构来存储计时器,而不是创建一组具有复杂编码名称的类属性。下面是一个例子:

import wx

trial_range = range(1, 3)
timer_range = range(7)

class TimersClass(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)

        panel = wx.Panel(self)
        self.button1 = wx.Button(panel, label = 'Go')
        self.Bind(wx.EVT_BUTTON, self.BuildTimers, self.button1)

        self.timers = {}  # a structure to hold the timers

    def BuildTimers(self, event):
        for trial in trial_range:
            for timer in timer_range:
                new_timer = wx.Timer(self)
                new_timer.Start(1 + timer*1000, oneShot=True)

                key = (trial, timer)
                self.timers[key] = new_timer # to keep the timer in the class
                new_timer.mykey = key  #optional: to know the key of the timer via the event (see Hi())

        self.Bind(wx.EVT_TIMER, self.Hi)

    def Hi(self, event):
        print "timer:",
        print event.GetEventObject().mykey


app = wx.PySimpleApp() 
frame = TimersClass(None)
frame.Center()
frame.Show()
app.MainLoop()
运行此操作时,将生成:

timer: (1, 0)
timer: (2, 0)
timer: (1, 1)
timer: (2, 1)
timer: (1, 2)
# etc

我不太了解eval中的作用域,但我看不到在任何地方定义对象timer0_迭代1。它应该来自哪里?我使用setattr方法创建它。现在我使用另一种方法,创建字符串self.timer0_iteration1,然后再次通过execself.timer0_iteration1=wx.Timerself.imf创建计时器。我犯了一个错误:该方法被称为oneShot而不是oneShot。我的计时器现在是使用exec而不是eval函数创建和运行的。eval给了我以下错误:回溯最近一次调用last:文件Escritorio/iteration_timers.py,第20行,在timers eval'self.+name+strimer+'''+'iteration'+strtrial+'=wx.Timerself'文件中,第1行self.timer0_iteration1=wx.Timerself^SyntaxError:语法无效,但使用exec可以正确运行。祝你一切顺利,毛里西奥。顺便说一句,现在我意识到不是用这种难看的语法evalname+strtimer++'.'+'迭代'+strtrial++'.Start'+strtimer*1000,+',OneShoot=True'我必须写一些东西,比如timer\u method='self.timer%s%s.Start%s,%s strtimer,strtrial,strtimer*1000,strone\u shot哇!它工作得很好,解决了我遇到的另一个问题:如何将不同的计时器绑定到Hi中的不同事件。现在使用一些类似if event.GetEventObject==self.timers[trial,timer]:它应该运行。谢谢!我试着在你的声誉中给你+1,但我是新来的,除非我有15嘿!如果event.GetEventObject==self.timers[event.GetEventObject.mykey]:,有一种更好的方法。再次感谢。很高兴听到这对你有用。对于不同的事件,有多种应对方式。你所做的很有效。我想您可以做一些类似的事情,比如,if event.GetEventObject.mykey==1,2,或者,当您构建self.timer时,您可以使用相同的键创建一个字典,但是使用您喜欢的响应。或者您可以使用functools.partial或lambda,如FogleBird在此处的回答所述: