У меня есть приложение wxPython. Я хочу, чтобы он отвечал на SIGTERM и SIGINT так же, как если бы нажала кнопка «закрыть». Однако, когда я связываю сигналы с помощью signal.signal(signal.SIGTERM, exit_handler)
, они выполняются только после того, как событие будет отправлено в основное приложение графически (нажатие кнопки, меню открытия и т. Д.). Как я могу избежать этого и выполнить дескрипторы, как только событие будет поймано?wxPython обработка SIGTERM/SIGINT
Соответствующие части кода:
class MyFrame(wx.Frame):
def __init__(self, parent, title):
# ...
self.Bind(wx.EVT_CLOSE, self.signal_handler)
signal.signal(signal.SIGTERM, self.signal_handler)
signal.signal(signal.SIGINT, self.signal_handler)
# ...
app = wx.App(redirect=False, clearSigInt=False)
frame = MyFrame(None, "Hello World")
app.MainLoop()
Это происходит даже в том случае, если вызовы сигнала перемещается за пределы какой-либо функции, и выполняется перед любыми WX вызовов.
Чтобы помочь вам понять, почему это работает так: сигналы IIRC, сигналы на Python пойманы, когда они происходят, но обрабатываются только при выполнении кода Python. Поэтому, если сигнал происходит, когда программа находится в MainLoop, ожидающем события, тогда ничего не будет сделано, пока что-то не приведет к тому, что элемент управления вернется к коду Python (например, отправка события обработчику в коде Python). Таким образом, используя таймер как описано выше, является одним из способов гарантировать, что элемент управления покидает MainLoop и периодически переходит в код Python, чтобы обработчики сигналов могли быть вызваны. – RobinDunn
@RobinDunn Я действительно должен был объяснить это в своем ответе, спасибо! –