以下程序会显示错误消息:
" RuntimeError:调用Python对象时超出了最大递归深度"。
原因是self.after
。
我在计算函数中创建while true
循环时工作正常,但我想使用self.after
引起循环,这是我应该如何与< EM> 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()
答案 0 :(得分:4)
递归是由于App
类派生自tk.TK
而不是tk.Frame
。最重要的是,您的__init__()
方法使用self.root=tk.Tk()
语句创建自己的基类的第二个实例,而不是调用其基类的__init__()
方法。在这种情况下,这尤其麻烦,因为tk.TK
类的实例是Tk的Toplevel
小部件,其包含Tcl解释器,并且通常应该只存在其中一个。
这是改变基类并完成我认为你正在尝试以正确方式做的事情的东西。在其中,我已经纠正,修改和简化了许多其他事情,特别是使代码符合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
答案 1 :(得分:0)
所以我通过摆脱单独的Gui功能进行了一些改写,但我认为这应该做你想做的事。
import Tkinter as tk
import ttk
import time
class App():
def __init__(self):
self.root = tk.Tk()
self.i = 0
self.label = tk.Label(text=str(self.i))
self.label.pack()
self.calculation()
self.root.mainloop()
def calculation(self):
self.i = self.i + 1
self.label.configure(text=self.i)
self.root.after(100, self.calculation)
app=App()