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