Можно ли зафиксировать нажатие на кнопку закрытия окна консоли Windows в python?

Можно ли как-то поймать ивент, когда пользователь закрывает консольную программу. И перед закрытием сделать какое-либо действие? Как это сделано в PyGame Python.

Кнопка закрытия


Ответы (2 шт):

Автор решения: Alex alexeev

Есть несколько вариантов решения твоей проблемы:

  1. самый простой(наверное), без использования сторонних либ:
import sys
try:
    # сюда программу
except KeyboardInterrupt:
    # если закрывается консоль то выполнять этот код
    sys.exit(0)
  1. С использованием стороннего модуля atexit:
import atexit

def cleanup():
    # если программа завершается то выполнять этот код

atexit.register(cleanup)

функция cleanup() отслеживает выход из проги включая Ctrl-C

  1. Используется модуль sigal, sys:
import signal
 import sys

 def signal_handler(signal, frame):
     #исполняемый код перед закрытием сюда
     sys.exit(0)

 signal.signal(signal.SIGINT, signal_handler)

думаю здесь и так понятно.

→ Ссылка
Автор решения: Pak Uula

Судя по скриншоту у вас 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 отрабатывает.

→ Ссылка