@Kostayn_junior

Как обработать нажатие кнопки во время работы цикла?

У меня есть программа с двумя кнопками, написанная на tkinter (python). Одна из них запускает цикл, условием которого является флаг, а вторая меняет значение флага, по которому цикл должен прерываться. Но при запуске цикла и попытке нажать кнопку изменения флага программа перестаёт отвечать. Как это можно исправить не выделяя отдельный поток приложению?
Вот код моего приложения
from tkinter import *

root = Tk()
root.title('Test')
root.geometry('350x200')
root.resizable(width=False, height=False)
i = 1
check = 0
def btnInterrupt_click():
    global check
    check = 1
def test():
    while check == 0:
        global i
        i += 1
        print(check)
btnStart = Button(root, text='Start', fg='black', bg='white', width=8, command=test)
btnStart.pack()
btnInterrupt = Button(root, text='Прервать', fg='black', bg='white', width=8, command=btnInterrupt_click)
btnInterrupt.pack()

root.mainloop()

60bf4607804f0494310020.png
  • Вопрос задан
  • 142 просмотра
Пригласить эксперта
Ответы на вопрос 3
Zoominger
@Zoominger Куратор тега Python
System Integrator
. Как это можно исправить не выделяя отдельный поток

Никак. У вас программа выполняется в одном GUI-потоке, поэтому и виснет.
Обычно программу делят на GUI и обработчики в разных потоках как раз для того, чтобы она не висла.
Ответ написан
Комментировать
danila763
@danila763
Учу python, sql
Писать асинхронный код
Ответ написан
Комментировать
@o5a
Не надо использовать свои циклы, чтобы не вызывать конфликт с циклом tkinter. Для запуска по времени есть root.after(время в мс, функция), через нее же можно и цикл сделать.
def something():
    if check != 0:
        # какие-то вычисления
        root.after(1000, something)

# для запуска самого цикла из основного кода программы
root.after(0, something)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы