Как остановить программу, не проверяя флаг остановки повсюду в коде?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как остановить программу, не проверяя флаг остановки повсюду в коде?

Сообщение Anonymous »


Я хочу создать кнопку остановки, которая останавливает процесс потоковой передачи, как показано в примере ниже. Моя проблема в том, что в моем реальном примере процесс представляет собой не простой цикл, а гораздо более сложный и включающий статические функции, которые занимают довольно много времени. Поэтому мне пришлось бы преобразовать статические функции в методы экземпляра и проверять флаг остановки повсюду в моем коде, что мне кажется некрасивым.

Есть ли способ заставить Python проверять флаг остановки каждые 2 секунды, независимо от того, на каком этапе процесса вы находитесь (даже если вы находитесь в статических функциях), и возвращать значение, если флаг равен True? Я могу представить, что функция tkinter after может каким-то образом это сделать, но не знаю как.
импортировать tkinter как tk импорт потоков время импорта защита static_counter(): для меня в диапазоне (10): время.сон(0.2) вернуть 10 класс MyGUI(): защита __init__(сам): self.root = tk.Tk() self.root.title("Счетчик") self.root.geometry('300x50+200+200') self.running = Ложь self.asked_stop = Ложь # кнопки self.button_start = tk.Button(text="Start", команда=lambda: threading.Thread(target=self.process).start()) self.button_start.grid(row=0, columns=0,sticky='NWSE',padx=5,pady=5) self.button_stop = tk.Button(text="Стоп", команда=self.stop) self.button_stop.grid(row=0, columns=1,sticky='NWSE',padx=5,pady=5) self.label_status_var = tk.StringVar() self.label_status_var.set("0") self.label_status = tk.Label(textvariable=self.label_status_var) self.label_status.grid(row=0, columns=2,sticky='NWSE',padx=5,pady=5) # настроить для меня в диапазоне (3): self.root.grid_columnconfigure(i, вес = 1) self.root.grid_rowconfigure(0, вес=1) # основной цикл self.root.mainloop() защита остановки (сам): self.asked_stop = Истина защита check_stop (сам): если self.asked_stop: self.label_status_var.set("остановлено") self.root.update() self.running = Ложь self.asked_stop = Ложь вернуть истину еще: вернуть ложь процесс защиты (сам): # проверка уже запущена если самозапуск: возвращаться еще: self.label_status_var.set("0") self.running = Истина # процесс счетчик = 0 пока правда: if self.check_stop(): # придется поместить это везде, включая static_counter() возвращаться счетчик += static_counter() self.label_status_var.set(str(счетчик)) self.root.update() если __name__ == '__main__': новый = МойGUI()
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»