Главная — Вопросы по программированию — Как прервать выполнение потока на Python в графическом приложении wxpyton?
Как прервать выполнение потока на Python в графическом приложении wxpyton?
- Post author: admin
- Запись опубликована: 4 января, 2022
- Post category: Вопросы по программированию
#python #multithreading #wxpython
Вопрос:
Я пишу приложение с графическим интерфейсом Python 3.9, используя wxPython. Приложение позволяет пользователю ввести информацию и нажать кнопку «рассчитать». Это приведет к запуску продолжительного потока, который обновляет главное окно приложения обновлениями статуса. Приложение успешно запускает поток вычислений и остается отзывчивым.
Теперь я хотел бы добавить кнопку «прервать», которая остановит/отменит/прервет ранее запущенный поток, когда пользователи решат нажать кнопку «прервать».
Поискав некоторое время, я нашел приведенный ниже код на веб-сайте wxPython, на котором есть общая структура, которую я ищу. Это следует основной логике моего приложения в более простой форме. В нем отсутствует текущее обновление статуса графического интерфейса, поэтому я сделал одно дополнение для имитации обновлений статуса графического интерфейса — см. «lt;lt;lt;lt;lt; wx.PostEvent(self._notify_window, ResultEvent(i))
#21. Операторы циклов break, continue и else | Python для начинающих
Однако после добавления этой строки кажется, что обработка событий прерывается, когда пользователь нажимает кнопку «стоп» во время запуска потока обработки. При нажатии кнопки «стоп» через 3-4 секунды поток подсчета в приведенном ниже примере кода продолжает выполняться и игнорирует событие кнопки «стоп».
Когда эта строка удаляется, функция «стоп» в приведенном ниже примере кода работает, и цикл прерывается.
Как я могу сохранить функцию обновления графического интерфейса с обновлениями статуса во время выполнения потока подсчета, а также использовать кнопку «остановить» для завершения активно работающего потока?
Я уверен, что есть способы оптимизировать приведенный ниже код. Пожалуйста, не стесняйтесь делиться своими мыслями/знаниями. Спасибо.
import time from threading import * import wx # Button definitions ID_START = wx.NewId() ID_STOP = wx.NewId() # Define notification event for thread completion EVT_RESULT_ID = wx.NewId() def EVT_RESULT(win, func): «»»Define Result Event.»»» win.Connect(-1, -1, EVT_RESULT_ID, func) class ResultEvent(wx.PyEvent): «»»Simple event to carry arbitrary result data.»»» def __init__(self, data): «»»Init Result Event.»»» wx.PyEvent.__init__(self) self.SetEventType(EVT_RESULT_ID) self.data = data # Thread class that executes processing class WorkerThread(Thread): «»»Worker Thread Class.»»» def __init__(self, notify_window): «»»Init Worker Thread Class.»»» Thread.__init__(self) self._notify_window = notify_window self._want_abort = 0 # This starts the thread running on creation, but you could # also make the GUI thread responsible for calling this #self.start() def run(self): «»»Run Worker Thread.»»» # This is the code executing in the new thread. Simulation of # a long process (well, 10s here) as a simple loop — you will # need to structure your processing so that you periodically # peek at the abort variable for i in range(10): if self._want_abort: # Use a result of None to acknowledge the abort (of # course you can use whatever you’d like or even # a separate event type) wx.PostEvent(self._notify_window, ResultEvent(None)) return time.sleep(2) wx.PostEvent(self._notify_window, ResultEvent(i)) lt;lt;lt;lt;lt;lt;lt; Added to simulate «status update» feedback of my application. # Here’s where the result would be returned (this is an # example fixed result of the number 10, but it could be # any Python object) wx.PostEvent(self._notify_window, ResultEvent(10)) def abort(self): «»»abort worker thread.»»» # Method for use by main thread to signal an abort self._want_abort = 1 # GUI Frame class that spins off the worker thread class MainFrame(wx.Frame): «»»Class MainFrame.»»» def __init__(self, parent, id): «»»Create the MainFrame.»»» wx.Frame.__init__(self, parent, id, ‘Thread Test’) # Dumb sample frame with two buttons wx.Button(self, ID_START, ‘Start’, pos=(0,0)) wx.Button(self, ID_STOP, ‘Stop’, pos=(0,50)) self.status = wx.StaticText(self, -1, », pos=(0,100)) self.Bind(wx.EVT_BUTTON, self.OnStart, self.Bind(wx.EVT_BUTTON, self.OnStop, # Set up event handler for any worker thread results EVT_RESULT(self,self.OnResult) # And indicate we don’t have a worker thread yet self.worker = None def OnStart(self, event): «»»Start Computation.»»» # Trigger the worker thread unless it’s already busy if not self.worker: self.status.SetLabel(‘Starting computation’) self.worker = WorkerThread(self) self.worker.start() def OnStop(self, event): «»»Stop Computation.»»» # Flag the worker thread to stop if running if self.worker: self.status.SetLabel(‘Trying to abort computation’) self.worker.abort() def OnResult(self, event): «»»Show Result status.»»» if event.data is None: # Thread aborted (using our convention of None return) self.status.SetLabel(‘Computation aborted’) else: # Process results here self.status.SetLabel(‘Computation Result: %s’ % event.data) # In either event, the worker is done self.worker = None class MainApp(wx.App): «»»Class Main App.»»» def OnInit(self): «»»Init Main App.»»» self.frame = MainFrame(None, -1) self.frame.Show(True) self.SetTopWindow(self.frame) return True if __name__ == ‘__main__’: app = MainApp(0) app.MainLoop()
Ответ №1:
Вы просто находитесь self.worker = None в неправильной точке.
Как сделать чтобы консоль Python не закрывалась
Он должен быть установлен только None на остановку или когда он завершается естественным образом, кроме того, что код в порядке.
напр.
import time from threading import * import wx # Button definitions ID_START = wx.NewId() ID_STOP = wx.NewId() # Define notification event for thread completion EVT_RESULT_ID = wx.NewId() def EVT_RESULT(win, func): «»»Define Result Event.»»» win.Connect(-1, -1, EVT_RESULT_ID, func) class ResultEvent(wx.PyEvent): «»»Simple event to carry arbitrary result data.»»» def __init__(self, data): «»»Init Result Event.»»» wx.PyEvent.__init__(self) self.SetEventType(EVT_RESULT_ID) self.data = data # Thread class that executes processing class WorkerThread(Thread): «»»Worker Thread Class.»»» def __init__(self, notify_window): «»»Init Worker Thread Class.»»» Thread.__init__(self) self._notify_window = notify_window self._want_abort = 0 # This starts the thread running on creation, but you could # also make the GUI thread responsible for calling this #self.start() def run(self): «»»Run Worker Thread.»»» # This is the code executing in the new thread. Simulation of # a long process (well, 10s here) as a simple loop — you will # need to structure your processing so that you periodically # peek at the abort variable for i in range(10): if self._want_abort: # Use a result of None to acknowledge the abort (of # course you can use whatever you’d like or even # a separate event type) wx.PostEvent(self._notify_window, ResultEvent(None)) return time.sleep(1) wx.PostEvent(self._notify_window, ResultEvent(i)) # lt;lt;lt;lt;lt;lt;lt; Added to simulate «status update» feedback of my application. # Here’s where the result would be returned (this is an # example fixed result of the number 10, but it could be # any Python object) time.sleep(2) wx.PostEvent(self._notify_window, ResultEvent(10)) def abort(self): «»»abort worker thread.»»» # Method for use by main thread to signal an abort self._want_abort = 1 # GUI Frame class that spins off the worker thread class MainFrame(wx.Frame): «»»Class MainFrame.»»» def __init__(self, parent, id): «»»Create the MainFrame.»»» wx.Frame.__init__(self, parent, id, ‘Thread Test’) # Dumb sample frame with two buttons wx.Button(self, ID_START, ‘Start’, pos=(0,0)) wx.Button(self, ID_STOP, ‘Stop’, pos=(0,50)) self.status = wx.StaticText(self, -1, », pos=(0,100)) self.Bind(wx.EVT_BUTTON, self.OnStart, self.Bind(wx.EVT_BUTTON, self.OnStop, # Set up event handler for any worker thread results EVT_RESULT(self,self.OnResult) # And indicate we don’t have a worker thread yet self.worker = None def OnStart(self, event): «»»Start Computation.»»» # Trigger the worker thread unless it’s already busy if self.worker: return else: self.status.SetLabel(‘Starting computation’) self.worker = WorkerThread(self) self.worker.start() self.status.SetLabel(‘Computation started’) def OnStop(self, event): «»»Stop Computation.»»» # Flag the worker thread to stop if running if self.worker: self.status.SetLabel(‘Trying to abort computation’) self.worker.abort() self.worker = None else: self.status.SetLabel(‘Computation not running’) def OnResult(self, event): «»»Show Result status.»»» if event.data is None: # Thread aborted (using our convention of None return) self.status.SetLabel(‘Computation aborted’) else: # Process results here self.status.SetLabel(‘Computation Result: %s’ % event.data) if event.data == 10: self.worker = None self.status.SetLabel(‘Computation Finished’) class MainApp(wx.App): «»»Class Main App.»»» def OnInit(self): «»»Init Main App.»»» self.frame = MainFrame(None, -1) self.frame.Show(True) self.SetTopWindow(self.frame) return True if __name__ == ‘__main__’: app = MainApp(0) app.MainLoop()
Источник: programbox.ru
Как остановить программу в Питоне командой?
У нас есть 18 ответов на вопрос Как остановить программу в Питоне командой? Скорее всего, этого будет достаточно, чтобы вы получили ответ на ваш вопрос.
Содержание
- Как остановить выполнение макроса?
- Как прервать выполнение программы с?
- Как остановить процесс в Python?
- Как остановить программу в Питоне командой? Ответы пользователей
- Как остановить программу в Питоне командой? Видео-ответы
Отвечает Наталья Фабричнова
В этом случае мы можем использовать Ctrl + Pause/Break, которая является гораздо более мощным способом остановки нашего сценария.Aug 23, 2021
Как остановить выполнение макроса?
Чтобы переключиться в режим приостановки выполнения, в меню Выполнить выберите команду Останов (CTRL+BREAK) или используйте ярлык на панели инструментов: .Чтобы переключиться в режим разработки, в меню Выполнить выберите команду Сбросить или используйте ярлык на панели инструментов: .11 апр. 2022 г.
Как прервать выполнение программы с?
В C++ вы можете выйти из программы следующими способами:Вызовите функцию exit .Вызовите функцию abort .Выполнение инструкции return из main .8 авг. 2022 г.
Как остановить процесс в Python?
kill() затем proc. terminate() затем sys.
Источник: querybase.ru
sleep() задержка программы в Python — Погружение кода в сон
В этой статье мы посмотрим на некоторые функции, которые можно считать удобными для выполнения этой задачи — выйти из программы Python.
Техника 1: Использование Quit () Функция
Встроенный Quit () Функция Предлагается функциями Python, может использоваться для выхода из программы Python.
Как только система столкнутся с функцией Quit (), она полностью завершает выполнение программы.
for x in range(1,10): print(x*10) quit()
Как видно выше, после первой итерации цикла для цикла интерпретатор встречает функцию Quit () и завершает программу.
Вызов sleep() через time.sleep()
В Python есть встроенная поддержка для погружения программы в сон. У модуля time есть функция sleep(), что позволяет отсрочить выполнение вызываемого потока на указанное количество секунд.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Telegram Чат time.sleep(3)»
3 loops , best of 3 : 3 sec per loop
Здесь модуль timeit запускается с параметром -n, что указывает timeit, сколько раз выполнять последующий оператор. Можно заметить, что timeit выполнил оператор 3 раза, а лучшее время длилось 3 секунды, чего и следовало ожидать.
По умолчанию timeit будет запускать код миллион раз. Если бы вы запустили вышеуказанный код, оставив значение -n по умолчанию, тогда при 3 секундах на итерацию код завис бы примерно на 34 дня! У модуля timeit есть несколько других настроек для командной строки, с которыми можно ознакомиться в документации.
Создадим что-то более практичное. Системному администратору всегда нужно быть в курсе, если какой-то из сайтов упал. Вы бы хотели иметь возможность проверить код состояния сайта регулярно, но запрашивать веб сервер постоянно нельзя, ведь это сильно повлияет на производительность. В Python одним из простых способов совершить такую проверку является использование системного вызова sleep():
import urllib . request
import urllib . error
def uptime_bot ( url ) :
conn = urllib . request . urlopen ( url )
except urllib . error . HTTPError as e :
# Отправка admin / log
print ( f ‘HTTPError: для ’ )
except urllib . error . URLError as e :
# Отправка admin / log
print ( f ‘URLError: для ’ )
print ( f ‘ поднят’ )
time . sleep ( 60 )
if __name__ == ‘__main__’ :
Здесь создается uptime_bot(), что принимает URL в качестве аргумента. Затем функция пытается открыть данный URL c urllib. При возникновении HTTPError или URLError программа перехватывает ошибку и выводит на экран. На практике вам, скорее всего, придется зафиксировать ошибку и отправить письмо веб-мастеру или системному администратору.
См. также: Что такое зарезервировано системой и можно его удалить? — Будни технической поддержки
Если ошибок нет, код спокойно выполняется. Вне зависимости от того, что произойдет, программа уходит в сон на 60 секунд. Это значит, что доступ к сайту будет раз за минуту. URL, используемый в примере, содержит ошибки. Ежеминутный вывод на консоли выглядит следующим образом:
HTTPError : 404 для http : / / www .google .com / py
Попробуйте обновить код, используя проверенный хороший URL, к примеру https://www.google.com/. После этого вы можете перезапустить программу и проверить, что изменилось. Также можно попробовать обновить код для отправки сообщения или записи об ошибке. Для получения более подробной информации можете ознакомиться со статьями отправка писем smtp и логирование.
Описание процесса
Уверен, Вы знаете, что приложения – это набор библиотек и файлов, написанных на определенном языке программирования. Их существует немало на сегодняшний день. К чему я веду? Pythonw.exe является модулем языка Python, точнее – его интерпретатором (преобразует код программы, написанной на Питоне в понятный для Windows).
Если в диспетчере задач Вы увидите такой элемент, значит на Вашем ПК есть утилиты, которые для работы используют указанный выше язык:
Опасно ли это? Совершенно нет. Но есть вероятность, что данный модуль запущен вредоносными скриптами. Они могут быть как относительно безобидными (показ рекламы), так и критическими для системы (повреждение и кража личных данных и файлов Виндовс). Вот здесь уже стоит задуматься.
Но как определить уровень угрозы? Зачастую, файл Pythonw.exe занимает на диске 27 648 или 27 136 байт. Если же размер его отличается от указанных показателей, вероятно Вы имеете дело с вирусным заражением. В первую очередь, рекомендую запустить антивирусную проверку (подойдет утилита
Ну а вдруг там вирус?
Я даже не знаю что на это сказать Ну всякое может быть, вдруг это вирус все таки и он специально создал папку чтобы вас поставить в ступор, типа чтобы вы были в замешательстве! И пока вы будете думать, то вирус будет делать свои дела.
На такой случай я вам советую проверить комп вот такими утилитами:
- AdwCleaner — этот инструмент позволяет найти и удалить рекламные вирусы, они сейчас заполонили интернет просто; утилита классная, так как удаляет даже неудаляемые вирусы и смотрит реестр Windows, браузерные папки и даже службы, в общем советую;
- HitmanPro — также эффективная антивирусная утилита, но имеет свои уникальные механизмы обнаружения угроз; отлично находит рекламную заразу и удаляет ее, проверяет все что можно;
- Dr.Web CureIt! — многие юзеры и так в курсе что это за программа, но тем не менее я напомню, что это один из лучших сканеров для поиска обычных, но более опасных вирусов, троянов, руткитов и прочей нечисти; скачивается уже с антивирусными базами, поэтому весит пару десятков мб;
- Kaspersky Virus Removal Tool — также спец по обычным вирусам, находит отлично, это не антивирус Касперского, это бесплатная утилита от них и не более; эффективность также как и у Dr.Web CureIt!, но тут так бы сказать кому что больше нравится;
См. также: Учебные пособия по Windows —
Будет хорошо, если вы проверите комп по одной утилите для рекламных и обычных вирусов, хотя я бы рекомендовал вам ознакомится со всеми. Если время есть — сделайте это
Все что смог накопать в интернете, все написал, больше инфы нет. Мое мнение — папка C:Python26 нужна для какой-то программы или была оставлена какой-то программой. А может она появилась при установке какого-то софта. Я уже дал совет как проверить, можно ли удалить папку C:Python26 или нет, так что теперь осталось только удачи пожелать вам
На главную! 31.05.2016
Синтаксис цикла while
В самом простом случае, цикл while в python очень похож по своей структуре на условную конструкцию с if :
import timea = 1if a == 1: print(«I’m the condition»)while a == 1: print(«I’m the loop») time.sleep(1)
И в том и в другом случае, блок кода внутри (инструкция print(‘…’) ) будет исполнен тогда и только тогда, когда условие (a == 1) будет иметь значение True . Вот только в конструкции с if , при успешной проверке, вывод на экран будет выполнен всего один раз, а в случае с while фраза «I’m the loop» будет печататься бесконечно.
Такое явление называется бесконечным циклом . У них есть свои определенные смысл и польза, но их мы разберём чуть позже, поскольку чаще всего цикл всё-таки должен как-то заканчиваться. И вполне логично, что для его завершения нужно произвести определенные манипуляции с условием.
Переменная a , в примере выше, называется управляющей (или счетчик). При помощи таких переменных можно контролировать момент выхода из цикла. Для этого их следует сравнить с каким-либо значением.
В Python есть и более сложные, составные условия. Они могут быть сколь угодно длинными, а в их записи используются логические операторы ( not , and , or ):
dayoff = Falsesunrise = 6sunset = 18worktime = 12# пример составного условияwhile not dayoff and sunrise You have 6 hours to workYou have 5 hours to workYou have 4 hours to workYou have 3 hours to workYou have 2 hours to workYou have 1 hours to workFinally it’s over!
См. также: Автовыключение компьютера с Windows 10: настройка автовыключения ПК по таймеру, установка программ для отложенного завершения работы
Как можно заметить, управляющая переменная вовсе не обязана являться счётчиком. Она может быть просто логической переменной, чье значение изменяется где-то в самом цикле:
Стоит иметь в виду, что использование неинициализированной переменной в качестве управляющей цикла обязательно приведёт к возникновению ошибки:
# unknown до этого нигде не была объявленаwhile unknown: print(‘+’)>Traceback (most recent call last): while unknown:NameError: name ‘unknown’ is not defined
См. также
- IronRuby
- Jython
Удаляем файл
Если в процессе работы возникает ошибка «прекращена работа программы Pythonw exe» как исправить? Необходимо удалить указанный элемент, а при необходимости пользующиеся им приложения заново загрузят его из сети. Сейчас расскажу, как остановить процесс и выполнить удаление его источника.
- Открываем диспетчер задач любым из известных способов (вот перечень);
- Находим элемент, который необходимо устранить, выделяем его курсором мышки и ниже (справа) нажимаем «Остановить» или «Снять задачу».
- Несмотря на предупреждение, соглашаемся с действием.
- Открываем консоль выполнения запросов, нажав комбинацию Win + R и вводим:
- Откроется окно командной строки (вот еще несколько методов попасть в консоль), где следует написать:
sc delete pythonw.exe
- После нажатия на Enter, стартует процедура очистки. По завершению, можно закрывать консоль.
Уверен, что инструкция помогла Вам. Pythonw exe как удалить Вы знаете, но еще раз напомню, что после устранения он может снова восстановиться по требованию использующего его приложения. Если это вирус, то стоит обязательно запустить антивирусное сканирование. Попробуйте одну из утилит, представленных в данном списке.
На этом всё. Появятся вопросы – пишите в комментариях.
С уважением, Виктор
См. также
- IronRuby
- Jython
- CPython
См. также [ править | править код ]
- IronRuby
- Jython
- CPython
использованная литература
- К а к в ы й т и и з п р о г р а м м ы P y t h o n ? – П е р е п о л н е н и е с т е к а
Ссылки
- ironpython.net — официальный сайт IronPython
- Основная страница проекта
- IronPython Вики
Эта страница в последний раз была отредактирована 4 мая 2021 в 16:32.
Как только страница обновилась в Википедии она обновляется в Вики 2.
Обычно почти сразу, изредка в течении часа.