Tkinter.self 导致错误无限循环
Tkinter.self causing infinite loop with error
下面的程序给出错误信息:
"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()
所以我通过删除单独的 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()
递归是由您的 App
class 派生自 tk.TK
而不是 tk.Frame
引起的。最重要的是,您的 __init__()
方法使用 self.root=tk.Tk()
语句创建其自己的基 class 的第二个实例,而不是调用其基 class 的 __init__()
应该的方法。这在这种情况下尤其麻烦,因为 tk.TK
class 的一个实例是 Tk 的 Toplevel
小部件,它包含 Tcl 解释器,并且通常应该只存在其中一个。
这里有一些东西可以改变基础 class 并以正确的方式完成我认为你正在尝试做的事情。我在其中更正、修改和简化了许多其他内容,特别是使代码符合 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
下面的程序给出错误信息:
"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()
所以我通过删除单独的 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()
递归是由您的 App
class 派生自 tk.TK
而不是 tk.Frame
引起的。最重要的是,您的 __init__()
方法使用 self.root=tk.Tk()
语句创建其自己的基 class 的第二个实例,而不是调用其基 class 的 __init__()
应该的方法。这在这种情况下尤其麻烦,因为 tk.TK
class 的一个实例是 Tk 的 Toplevel
小部件,它包含 Tcl 解释器,并且通常应该只存在其中一个。
这里有一些东西可以改变基础 class 并以正确的方式完成我认为你正在尝试做的事情。我在其中更正、修改和简化了许多其他内容,特别是使代码符合 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