Приостановка программы по нажатию кнопки

Программа - цикл в 1000 итераций, на выполнение уходит 1.5 часа. Как лучше всего реализовать Приостановку главного цикла по нажатию кнопки? Приостановка = бесконечное ожидание до повторного нажатия кнопки. Цикл не начинается заново, а продолжается с того момента, на котором был остановлен. Для начала написал вот такой код. При нажатии на кнопку поток останавливается, при повторном нажатии продолжает работу с нужного момента. Но при повторном нажатии на кнопку запускается еще второй параллельный поток, который проходит весь цикл с самого начала. Как это избежать ? Или может есть более простой способ паузы программы ?

import tkinter
import time
from threading import Thread

def button_click():
    global running
    if running == True:
        running = False
    else:
        running = True
        t = Thread(target=action)
        t.start()

def action():
    for i in range(1000):
        if running == False:
            while running == False:
                time.sleep(2)
        else:
            print(i)
            time.sleep(5)

running = False
top = tkinter.Tk()
Button = tkinter.Button(top, text="Start", command=button_click).pack()
top.mainloop()

Ответы (1 шт):

Автор решения: captainsadday

Нашел решение! Основной процесс запускаем как главный цикл. А графический интерфейс tkinter запускаем параллельным потоком через Thread. В итоге мы можем выполнять основной цикл и параллельно взаимодействовать с кнопочками из tkinter - менять значение глобальной переменной running. В цикле мы учитываем значение running в начале каждой итерации.

import tkinter
import time
from threading import Thread

def button_click():
    global running
    if running == True:
        running = False
    else:
        running = True

def window():
    top = tkinter.Tk()
    Button = tkinter.Button(top, text="Start", command=button_click).pack()
    top.mainloop()

running = False

t = Thread(target=window)
t.start()

for i in range(10):

    if running == False:
        while running == False:
            # ожидаем повторного нажатия кнопочки
            time.sleep(2)

    if running == True:
        # выполняем основную полезную работу программы
        print(i)
        time.sleep(5)
→ Ссылка