0

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 行目、タイマー eval(name + str(timer) + '_' + 'iteration' + str(trial) + '.Start(' + str(timer * 1000, ) + ', OneShoot = True)') File "", line 1, in NameError: name 'timer0_iteration1' is not defined

このコードが実行されない理由を誰かが知っていますか、または別のアプローチがありますか?

どうもありがとう!!

4

1 に答える 1

0

クラス内で適切な構造を使用してタイマーを格納することをお勧めします (複雑にエンコードされた名前で一連のクラス属性を作成するのではなく)。次に例を示します。

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
于 2012-06-16T04:29:37.847 に答える