【问题标题】:problem in the space of program changing label many times程序多次换标空间问题
【发布时间】:2020-01-19 16:18:59
【问题描述】:

我正在做一个程序,每 25 分钟给用户一次注意力,然后给他 5 分钟的休息时间,一切都很好,可以用少量时间(少于 2 分钟)测试代码,但是当我在真正的 25 中测试它时min ,它给了我这个错误:

RecursionError: 超出最大递归深度

我认为我需要更改递归深度,然后我将其更改为:

sys.setrecursionlimit(1000000)

然后它确实超过了 2 分钟,但是当它达到大约 10 分钟时,程序就被杀死了!

我猜这是因为程序占用了很大的内存空间或类似的东西,但是我该如何解决这个问题!!?

我将尝试简单地给你主要功能,以便你理解这个想法::

sec=1500
count=0
def run():
    global sec
    global count
    m,s=divmod(sec,60)   
    if sec >=0:
        m,s=divmod(sec,60)
        lblmin.config(text=str(m).zfill(2))
        lblsec.config(text=str(s).zfill(2))
        sec -= 1
        if sec==-1:
            count += 1
            if count%2 ==0 :   #to know if the timer will do 5 min or 25 min
                confstr=messagebox.showinfo("stert?","timer will start now")
                if confstr:
                    sec=1500
            else: #for break
                runbreak=False
                if runbreak == False:
                    root.attributes("-topmost", True)
                    ask=messagebox.askyesno("break","break for 5 min")
                    runbreak=True
                if runbreak:
                    sec=300


    root.after(1000,run)
    root.mainloop()

也许(正是我的想法)这是因为 lblminlblsec 正在改变的巨大时间,但我真的没有任何想法来解决这个问题问题。

请帮忙:(

【问题讨论】:

标签: python tkinter time label space


【解决方案1】:

Python 没有针对尾递归进行优化,这个article 中有解释。

实际上,这意味着 python 限制了函数可以调用自身的次数(如果没有,最终会发生堆栈溢出)。您可以更改该限制,就像使用 setrecursionlimit 一样,但从根本上说,该限制始终存在。

我建议您重构代码以使用 while 循环来保持循环。

【讨论】:

    猜你喜欢
    • 2016-11-01
    • 1970-01-01
    • 2013-04-04
    • 2017-08-27
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 2019-04-29
    相关资源
    最近更新 更多