Мне нужно сделать простой интерфейс для программы. При нажатии на кнопку Start запуск программы, при нажатии на кнопку Stop (или даже лучше на ту же кнопку повторно) остановка, при нажатии на QUIT выход из программы. Я попробовал несколько вариантов, но интерфейс зависает, когда я нажимаю на стоп, а то и при нажатии на старт, сама же программа успешно продолжает работать в интерпретаторе. Программа состоит из трех блоков Try внутри бесконечного цикла while True, если в блоке try1 состоялось определенное условие, программа пропускает следующий блок try2 и начинает новый цикл. Если условие было иным программа переходит ко второму блоку try2, далее процедура, затем try3, после чего новый цикл, время каждого процесса отдельно внутри одного блока или всего цикла вместе не должно быть чем-либо ограничено. На выполнение одного цикла может потребоваться от нескольких секунд до часа и больше если понадобится, зависит от времени самого ввода данных пользователем, в том числе и через голосовое распознавание. Я впервые работаю с tkinter и не совсем хорошо понимаю как это реализовать, поэтому нужна ваша помощь на каком-нибудь простом и действенном примере, чтобы понять что именно я делаю не так. Все нижеприведенные варианты сами по себе работают, но не с этим мне кодом. Единственное что требуется для моей программы это запустить её и прервать на любой стадии выполнения как этот делает IDE
вариант 1
import tkinter as Tk
import threading
import time
def task():
while not kill_switch.is_set():
print('ЗДЕСЬ КОД ПРОГРАММЫ')
time.sleep(1)
def start_thread():
global kill_switch, sub_thread
kill_switch = threading.Event()
sub_thread = threading.Thread(target=task)
sub_thread.start()
def stop_thread():
kill_switch.set()
sub_thread.join()
root = Tk.Tk()
Tk.Button(root, text='START', command=start_thread, height=5, width=20,).pack(side=Tk.LEFT)
Tk.Button(root, text='STOP', command=stop_thread, height=5, width=20,).pack(side=Tk.LEFT)
Tk.Button(root, text='QUIT', command=root.quit, height=5, width=20,).pack(side=Tk.LEFT)
root.mainloop()
вариант 2
import tkinter as Tk
root = Tk.Tk()
run = False
def worker():
print('ЗДЕСЬ КОД ПРОГРАММЫ')
if run:
root.after(500, worker)
def start_timer():
global run
run = True
root.after(0, worker)
def stop_timer():
global run
if run:
print('halting.')
run = False
Tk.Button(root, text='START', command=start_timer,
height=5, width=20,).pack(side=Tk.LEFT)
Tk.Button(root, text='STOP', command=stop_timer,
height=5, width=20,).pack(side=Tk.LEFT)
Tk.Button(root, text='QUIT', command=root.quit,
height=5, width=20,).pack(side=Tk.LEFT)
root.mainloop()
вариант 3
import tkinter as Tk
root = Tk.Tk()
root.title('Timer test')
root.geometry("200x100+200+200")
class TkJob:
def __init__(self, arange, brange, interval, root):
self.amin, self.amax = arange
self.bmin, self.bmax = brange
self.root = root
self.interval = interval
self.a, self.b = self.amin, self.bmin
self.run = False
def step(self):
if not self.run:
return
print('ЗДЕСЬ КОД ПРОГРАММЫ')
if self.run:
self.root.after(self.interval, self.step)
def start(self):
print('job is running.')
self.run = True
def stop(self):
print('job is halted.')
self.run = False
def start_job():
j.start()
root.after(0, j.step)
def stop_job():
if j.run:
print('halting.')
j.stop()
j = TkJob((0, 3), (0, 5), 500, root)
Tk.Button(root, text='START', command=start_job,
height=5, width=20,).pack(side=Tk.LEFT)
Tk.Button(root, text='STOP', command=stop_job,
height=5, width=20,).pack(side=Tk.LEFT)
Tk.Button(root, text='QUIT', command=root.quit,
height=5, width=20,).pack(side=Tk.LEFT)
root.mainloop()