Tkinter.self导致无限循环错误

时间:2015-08-18 15:16:19

标签: python tkinter infinite-loop

以下程序会显示错误消息:

  

" 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()

2 个答案:

答案 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()