2016-07-07 12 views
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呼び出しの前に実行された場合でも発生します。

答えて

1

これを行う1つの方法は、イベントを偽造するために 'タイマー'を追加することです。

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

このように動作する理由を理解するのに役立ちます。IIRC、Pythonのシグナルは発生時に捕捉されますが、Pythonコードの実行時にのみ処理されます。したがって、プログラムがMainLoopでイベントを待っている間に信号が発生した場合、何かが制御をPythonコードに戻すまで(イベントをPythonコードのハンドラにディスパッチするなど)何も処理が行われない限り何も実行されません。上記のように、コントロールがMainLoopを離れて定期的にPythonコードに入り、シグナルハンドラを呼び出すことができるようにする方法の1つです。 – RobinDunn

+0

@RobinDunn本当にありがとう! –

関連する問題