为什么此代码会以#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()
答案 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作为第二个参数。