超出最大递归深度。试图在Tkinter Python中创建一个计时器

时间:2017-07-20 17:08:09

标签: python tkinter

我正在尝试在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

enter image description here

问题:如何处理此错误?以及如何在Tkinter中创建这种计时器?

1 个答案:

答案 0 :(得分:3)

问题出在下面一行

self.__timeFrame.after(1000, self.Tick(index))

您可以直接调用self.Tick来创建递归。要解决此问题,请将index作为after方法的另一个参数传递,如下所示

self.__timeFrame.after(1000, self.Tick, index)
相关问题