2016-07-07 5 views
1

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 호출 전에 실행되는 경우에도 발생한다.

답변

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, 파이썬의 신호는 발생했을 때 잡히지 만 파이썬 코드를 실행할 때만 처리됩니다. 따라서 프로그램이 MainLoop에서 이벤트를 기다리는 동안 이벤트가 발생하면 무언가가 컨트롤을 파이썬 코드로 반환 할 때까지 (예 : 이벤트를 파이썬 코드로 처리기로 전달하는 등) 타이머가 사용되기 전까지 아무 것도 처리되지 않습니다. 위와 같이 컨트롤이 MainLoop을 떠나 파이썬 코드로 주기적으로 들어가 시그널 핸들러를 호출 할 수 있도록하는 한 가지 방법입니다. – RobinDunn

+0

@RobinDunn 정말 내 대답에, 설명 해 줘야 겠어! –