Python中有两种类型的递归,一种是有效的,另一种是不行的

时间:2015-12-18 15:47:05

标签: python recursion tkinter

为什么此代码会以#RuntimeError爆炸:调用Python对象时超出最大递归深度

import Tkinter as tk

counter = 0 
def counter_label(label):
    global counter
    counter += 1
    label.config(text=str(counter))
    label.after(1000, counter_label(label))   

root = tk.Tk()
root.title("Counting Seconds")
label = tk.Label(root, fg="green")
label.pack()
counter_label(label)
button = tk.Button(root, text='Stop', width=25, command=root.destroy)
button.pack()
root.mainloop()

以下对counter_label的定义没有?

def counter_label(label):
    def count():
        global counter
        counter += 1
        label.config(text=str(counter))
        label.after(1000, count)
    count()

2 个答案:

答案 0 :(得分:2)

看看这一行:

label.after(1000, counter_label(label))  

这与此完全相同:

foo = counter_label(label)
label.after(1000, foo)

看到问题?您立即致电counter_label,立即拨打counter_label,立即呼叫...

使用after时,必须为函数提供引用。需要额外的参数作为after的附加参数:

label.after(counter_label, label)

答案 1 :(得分:0)

在第一个代码片段label.after(1000, counter_label(label))中,这个代码被递归调用,而不会被破坏。对于任何递归,你需要一个基本条件来递归它。

可能的解决方案

def counter_label(label):
    global counter
    counter += 1
    if counter == 10: # this is the base condition
        return counter; # anything that you want.
    label.config(text=str(counter))
    label.after(1000, counter_label(label)) 

第二个片段不是递归label.after(1000, count)你只是将函数引用传递给lable.after作为第二个参数。