Я пишу приложение Python, используя GTK для графического интерфейса. Я заметил, что закрытие его с помощью Ctrl-C с терминала не работает, и я обнаружил, что это из-за ошибки, поэтому я попытался вручную обработать сигнал. Проблема в том, что если я установил поведение по умолчанию на значение по умолчанию, сигнал пойман и приложение будет закрыто правильно, но если я использую пользовательский обработчик, он не работает. Вот моя (упрощенный) код:Обработчик сигнала Python GTK не работает
from gi.repository import Gtk
import signal
class MainWindow(Gtk.Window):
def __init__(self):
...
signal.signal(signal.SIGINT, self.__signal_handler)
def __signal_handler(self, signal, frame):
print "Caught!"
...
if __name__ == "__main__":
win = MainWindow()
win.show_all()
Gtk.main()
Если, вместо этого, я установить поведение по умолчанию, сигнал ловится правильно:
from gi.repository import Gtk
import signal
class MainWindow(Gtk.Window):
def __init__(self):
...
signal.signal(signal.SIGINT, signal.SIG_DFL)
...
if __name__ == "__main__":
win = MainWindow()
win.show_all()
Gtk.main()
ли я что-то отсутствует?
EDIT:
Я попробовал еще немного, и я заметил, что сигнал действительно захвачен, но окно не немедленно выключается, но только тогда, когда основное внимание было приобретено еще раз. Если вместо этого я запустил
kill -9 pid
из другого окна терминала, заявление закрывается немедленно.
Вам нужен для ручного управления сигналом, хотя?См. [Прерывание клавиатуры с помощью python gtk?] (Http://stackoverflow.com/questions/16410852/keyboard-interrupt-with-with-python-gtk) –
Да, я хотел бы установить обработчик для правильного управления данными записывается в файл, даже если программа убита, отправив SIGINT. – Pyrox