以下程序给出错误信息:
"RuntimeError: maximum recursion depth exceeded while calling a Python object".
原因是self.after
。
当我在计算函数中创建一个 while true
循环时它工作正常,但我想用 self.after
引起循环,这就是我的方式阅读它应该与 Tkinter 一起完成。任何建议表示赞赏。
import Tkinter as tk
import ttk
import time
class App(tk.Tk):
def __init__(self):
self.root=tk.Tk()
self.var1=tk.StringVar()
self.i=0
def Calculation(self):
# complex calculations that last 30 minutes in total
self.i+=1
self.var1.set(str(self.i))
self.root.update()
self.after(100, self.Calculation)
def Gui(self):
your_label=tk.Label(self.root,textvariable=self.var1).pack()
A=App()
A.Gui()
A.Calculation()
最佳答案
递归是由您的 App
类派生自 tk.TK
而不是 tk.Frame
引起的。最重要的是,您的 __init__()
方法使用 self.root=tk.Tk()
语句创建它自己的基类的第二个实例,而不是调用它的基类类的 __init__()
方法。这在这种情况下尤其麻烦,因为 tk.TK
类的实例是 Tk 的 Toplevel
小部件,它包含 Tcl 解释器,通常应该只有一个他们存在。
这里有一些东西可以改 rebase 类并以正确的方式完成我认为你正在尝试做的事情。我在其中更正、修改和简化了许多其他内容,特别是使代码符合 PEP8 style guidelines .
import Tkinter as tk
class App(tk.Frame):
def __init__(self, master=None):
tk.Frame.__init__(self, master)
self.pack()
self.var1 = tk.StringVar()
self.i = 0
tk.Label(self, textvariable=self.var1).pack()
def calculation(self):
# complex calculations that last 30 minutes in total
self.i += 1
self.var1.set(str(self.i))
# self.update() # no need, will be automatic as mainloop() runs
self.after(100, self.calculation)
app=App()
app.calculation() # start calculations
app.mainloop() # run gui
关于python - Tkinter.self 导致无限循环错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32076325/