【问题标题】:Maximum recursion depth exceeded. Trying to create a timer in Tkinter Python [duplicate]超出最大递归深度。尝试在 Tkinter Python 中创建计时器 [重复]
【发布时间】:2017-12-26 12:40:59
【问题描述】:

我正在尝试在 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 中创建这样的计时器?

【问题讨论】:

  • 这类似于调用函数而不是传递函数作为按钮命令参数,如this question
  • FWIW,你可能会觉得this answer很有趣。

标签: python tkinter


【解决方案1】:

问题出在下面一行

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

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

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

【讨论】:

  • 当然,我应该更好地学习after方法。谢谢。
猜你喜欢
  • 1970-01-01
  • 2016-05-21
  • 2017-07-18
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
  • 2011-01-24
相关资源
最近更新 更多