我有一个wxPython应用程序。我希望它响应SIGTERM和SIGINT,就像点击了"关闭"按钮一样。但是,当我使用 signal.signal(signal.SIGTERM, exit_handler)
绑定信号时,它们仅在以图形方式将事件发送到主应用程序(单击按钮、打开菜单等)后执行。如何避免这种情况并在捕获事件后立即执行句柄?
代码的相关部分:
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 调用之前执行,也会发生这种情况。
一种方法是添加一个"计时器"来伪造事件。
import wx
import signal, os
def signalUSR1_handler(sig,frame):
print ("Signal Caught")
class ExampleFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent)
pid_no = str(os.getpid())
panel = wx.Panel(self)
self.quote1 = wx.StaticText(panel, label="Test signal with timer", pos=(20, 30))
self.quote2 = wx.StaticText(panel, label="Send this process a USR1 signal", pos=(20, 50))
self.quote3 = wx.StaticText(panel, label="kill -s USR1 "+pid_no, pos=(20, 70))
self.button = wx.Button(panel, -1, "Click", pos=(20,90))
self.button.Bind(wx.EVT_BUTTON, self.OnPress)
self.timer = wx.Timer(self)
self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)
self.timer.Start(1000)
self.Show()
def OnPress(self, event):
print ("Button Pressed")
def OnTimer(self, event):
return
app = wx.App()
ExampleFrame(None)
signal.signal(signal.SIGUSR1,signalUSR1_handler)
app.MainLoop()