Можно ли зафиксировать нажатие на кнопку закрытия окна консоли Windows в python?
Можно ли как-то поймать ивент, когда пользователь закрывает консольную программу. И перед закрытием сделать какое-либо действие? Как это сделано в PyGame Python.
Ответы (2 шт):
Есть несколько вариантов решения твоей проблемы:
- самый простой(наверное), без использования сторонних либ:
import sys
try:
# сюда программу
except KeyboardInterrupt:
# если закрывается консоль то выполнять этот код
sys.exit(0)
- С использованием стороннего модуля
atexit:
import atexit
def cleanup():
# если программа завершается то выполнять этот код
atexit.register(cleanup)
функция cleanup() отслеживает выход из проги включая Ctrl-C
- Используется модуль sigal, sys:
import signal
import sys
def signal_handler(signal, frame):
#исполняемый код перед закрытием сюда
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
думаю здесь и так понятно.
Судя по скриншоту у вас Windows.
Вам нужно установить обработчик закрытия консоли через функцию SetConsoleCtrlHandler из Win32 API.
Вот пример:
import win32api
import os
import datetime
def on_exit(sig, func=None):
with open("some.txt", mode='w') as f:
f.write("Console closed: " + str(datetime.datetime.now()));
print("exit handler")
os.system('pause')
win32api.SetConsoleCtrlHandler(on_exit, True)
while True:
pass
Этот скрипт вызывает функцию on_exit при закрытии окна консоли и запускает программу pause, которая просит Press any key to continue...
На самом деле on_exit получает несколько разных сигналов, но в этом примере я не стал заморачиваться со специальной обработкой разных причин закрытия консоли.
Когда скрипт запускается из cmd.exe, оно действительно просит нажать любую кнопку.
Если же скрипт запускать из Windows Terminal, то терминал закрывается моментально, но тем не менее в some.txt записывается точный момент закрытия окна, то есть on_exit отрабатывает.
