我正在尝试在Tkinter中创建一个计时器。这是我的工作范例:
# GUI packages
from Tkinter import *
from ttk import *
from tkMessageBox import *
sec = 0
#_
class RunMeasurement(Tk):
def __init__(self, *args, **kwargs):
Tk.__init__(self, *args, **kwargs)
Tk.style = Style()
Tk.title = 'Data sheet creation'
self.__timeLabel = None
myFrame = Frame(self)
myFrame.pack(fill='both')
self.__timeLabel = Label(myFrame)
timeButton = Button(myFrame, text='start', command=self.Tick)
timeButton.grid(row=0, column=0)
self.__timeLabel.grid(row=0, column=1)
def Tick(self):
global sec
sec += 1
self.__timeLabel['text'] = sec
self.__timeLabel.after(1000, self.Tick)
if __name__ == '__main__':
app = RunMeasurement()
app.mainloop()
但是,如果我尝试稍微更改它,例如,每次以这种方式计数2或3(仅更改先前代码的相应部分):
...
timeButton = Button(myFrame, text='start', command=lambda: self.Tick(3))
...
def Tick(self, index):
...
sec += index
...
self.__timeFrame.after(1000, self.Tick(index))
我很快就得到了这个(见图)。然后是RuntimeError:
RuntimeError: maximum recursion depth exceeded while calling a Python object
问题:如何处理此错误?以及如何在Tkinter中创建这种计时器?
答案 0 :(得分:3)
问题出在下面一行
self.__timeFrame.after(1000, self.Tick(index))
您可以直接调用self.Tick
来创建递归。要解决此问题,请将index
作为after
方法的另一个参数传递,如下所示
self.__timeFrame.after(1000, self.Tick, index)