1
我有一個wxPython應用程序。我希望它對SIGTERM和SIGINT作出響應,就好像「close」按鈕已被點擊一樣。但是,當我使用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我真的應該在我的回答中解釋說,謝謝! –