我创建了一个可以使用带有一组参数的函数的类。我想在每次事件处理程序发出信号时运行传递的函数。
我在下面附上了我的代码,当我传递一个fun2
没有参数但没有参数时运行的代码fun1
。fun1
我可以对下面的代码提出任何建议fun2
吗?如果我省略了 from 的 return 语句fun1
,我会得到一个错误'str' object is not callable
。
>>> TimerTest.main()
function 1. this function does task1
my function from init from function1
my function in start of runTimerTraceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Program Files (x86)\IronPython 2.7\TimerTest.py", line 57, in main
File "C:\Program Files (x86)\IronPython 2.7\TimerTest.py", line 25, in runTime
r
TypeError: str is not callable
import System
from System.Timers import (Timer, ElapsedEventArgs)
class timerTest:
def __init__ (self, interval,autoreset, fun):
self.Timer = Timer()
self.Timer.Interval= interval
self.Timer.AutoReset = autoreset
self.Timer.Enabled = True
self.myfunction = fun
def runTimer(self):
print 'my function in start of runTimer', self.myfunction ()
self.Timer.Start()
def OnTimedEvent (s, e):
print "The Elapsed event was raised at " , e.SignalTime
print 'printing myfunction...', self.myfunction()
self.myfunction()
self.Timer.Elapsed += OnTimedEvent
def stopTimer(self):
self.Timer.Stop()
self.Timer.Dispose= True
def fun1(a,b):
print 'function 1. this function does task1'
return 'from function1'
def fun2():
print 'Function 2. This function does something'
print 'Test 1...2...3...'
return 'From function 2'
def main():
a = timerTest(1000, True, fun1(10,20))
a.runTimer()
b= timerTest(3000,True,fun2)
b.runTimer()
if __name__ == '__main__':
main()
我正在学习 Python,如果我的问题是基本的,我深表歉意。
要更改间隔,我使用添加到 timerTest 类的 stopTimer 方法停止计时器:
def stopTimer(self):
self.Timer.Stop()
我采用新的用户输入来调用我根据 Paolo Moretti 的建议修改的 runTimer 方法:
def runTimer(self, interval,autoreset,fun,arg1, arg2, etc.):
self.Timer.Interval= interval
self.Timer.AutoReset = autoreset
myfunction = fun
my_args = args
self.Timer.Start()
def OnTimedEvent (s, e):
print "The Elapsed event was raised at " , e.SignalTime
myfunction(*my_args)
self.Timer.Elapsed += OnTimedEvent
每当按下命令按钮时,都会调用以下方法:
requestTimer.runTimer((self.intervalnumericUpDown.Value* 1000),True, function, *args)
我不明白为什么停止计时器并发送请求会导致 runTimer 方法被执行多次,这似乎取决于我更改间隔的次数。我尝试了几种方法:关闭并处置但没有成功。
关于稍微不同的主题的第二个问题。
我一直在研究其他带有 Timer 类的 .NET 类。第二个问题是如何将以下 VB 示例代码转换为 Python。“作为 TimerCallback 的回调”是否等同于 myfunction(*my_args)?
Public Sub New ( _
callback As TimerCallback, _
state As Object, _
dueTime As Integer, _
period As Integer _
)
每个 .NET 文档:回调 类型:System.Threading.TimerCallback 代表要执行的方法的 TimerCallback 委托。如果我定义一个没有参数的函数,我可以部分触发计时器事件,例如:
def fun2(stateinfo):
# function code
适用于:
self.Timer = Timer(fun2, self.autoEvent, self.dueTime,self.period)
如果我用更通用的函数调用 myfunction(*my_args) 替换 fun2,函数调用将失败