python - Tkinter.self 导致无限循环错误

标签 python tkinter infinite-loop

以下程序给出错误信息:

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

最佳答案

递归是由您的 App 类派生自 tk.TK 而不是 tk.Frame 引起的。最重要的是,您的 __init__() 方法使用 self.root=tk.Tk() 语句创建它自己的基类的第二个实例,而不是调用它的基类类的 __init__() 方法。这在这种情况下尤其麻烦,因为 tk.TK 类的实例是 Tk 的 Toplevel 小部件,它包含 Tcl 解释器,通常应该只有一个他们存在。

这里有一些东西可以改 rebase 类并以正确的方式完成我认为你正在尝试做的事情。我在其中更正、修改和简化了许多其他内容,特别是使代码符合 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

关于python - Tkinter.self 导致无限循环错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32076325/

相关文章:

python - 我应该把 Celery 配置文件放在哪里?

python - 将列表拆分为奇数条目和偶数条目的两个列表

c - C代码的区别?

python - 如何创建具有给定有效数字位数的decimal.Decimal对象?

python - 在 Celery 任务中获取 task_id

python - 如何计算 pandas 数据框中一系列列的一组值的出现次数?

python - 使用透明背景配置 tkinter/ttk 小部件,ttk 框架背景颜色?

python - tkinter:模拟时钟刷新 - "after"功能如何工作?

python - 更新条目中的文本 (Tkinter)

c - PIC死循环