自我介绍导致无限循环

2024-03-29 08:41:13 发布

您现在位置:Python中文网/ 问答频道 /正文

以下程序给出错误消息:

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

Tags: importself程序apptkinterdef错误gui
2条回答

递归是由您的App类派生自tk.TK而不是{}引起的。除此之外,__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

所以我做了一点重写,去掉了单独的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()

相关问题 更多 >