Приостановка программы по нажатию кнопки
Программа - цикл в 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 шт):
Нашел решение! Основной процесс запускаем как главный цикл. А графический интерфейс 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)