проблема в пространстве смены метки программы много раз - PullRequest
0 голосов
/ 19 января 2020

Я делаю программу, которая привлекает внимание пользователя каждые 25 минут, затем дает ему 5-минутный перерыв, все было хорошо для тестирования кода с небольшим количеством времени (менее 2 минут), но когда я тестировал его в реальном времени 25 мин, это дает мне эту ошибку:

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

возможно (именно то, что я думаю), это из-за огромного времени, которое lblmin и lblse c меняются, но я действительно не представляю, как решить эту проблему.

, пожалуйста, помогите: (

1 Ответ

0 голосов
/ 19 января 2020

Python не оптимизирован для хвостовой рекурсии, в этой статье есть объяснение .

Практически это означает, что python ограничивает количество раз, которое функция может вызывать сама (если этого не произойдет, в конечном итоге будет переполнение стека). Вы можете изменить этот лимит, так как вы используете setrecursionlimit, но, по сути, этот предел всегда будет существовать.

Я предлагаю вам рефакторинг кода, чтобы использовать некоторое время l oop, чтобы продолжать цикл вместо этого .

...