wxPython处理SIGTERM / SIGINT

时间:2016-07-07 12:39:19

标签: python python-2.7 wxpython signals

我有一个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调用之前执行,也会发生这种情况。

1 个答案:

答案 0 :(得分:2)

这样做的一种方法是添加一个'计时器'伪造一个事件。

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()