2012-07-07 2 views
0

내 창에 SpinCtrl이 있으며 마우스의 위쪽 또는 화살표 키 (회전의 끝)에서만 회전 이벤트를 처리하려고합니다. 이런 이벤트가 없으므로 마우스 이벤트를 사용하려고했습니다. 그러나 EVT_LEFT_DOWNEVT_LEFT_UP을 바인딩하면 EVT_SPIN은 더 이상 전송되지 않으며 컨트롤은 아무 작업도 수행하지 않습니다.wxPython으로 회전 이벤트의 끝을 얻는 방법

SpinCtrl을 사용하여 회전 이벤트가 끝나는 것을 어떻게 감지 할 수 있습니까? EVT_LEFT_DOWN 및 다른 이벤트에서 기본 이벤트 처리기를 호출 할 수 있습니까?

+1

당신은 기본 이벤트 핸들러를 호출 할 수 있습니다()를' – GP89

답변

1

누가 관심 : 나는 해결책 가지고 :`event.Skip를 호출하여

class SpinEndEventManager(object): 
    def __init__(self): 
     self._controls = [] 
     self._event_handlers = [] 
     self._has_spinned = False 

    def add(self, control, event_handler): 
     self._controls.append(control) 
     self._event_handlers.append(event_handler) 
     control.Bind(wx.EVT_SPINCTRL, self._on_event) 
     control.Bind(wx.EVT_LEFT_UP, self._on_event) 
     control.Bind(wx.EVT_KEY_DOWN, self._on_event) 
     control.Bind(wx.EVT_KEY_UP, self._on_event) 

    def _on_event(self, event): 
     is_spin_end_event = False 
     event_type = event.GetEventType() 
     control = event.GetEventObject() 
     if event_type == wx.wxEVT_COMMAND_SPINCTRL_UPDATED: 
      self._has_spinned = True 
     elif event_type == wx.wxEVT_LEFT_UP: 
      if self._has_spinned: 
       is_spin_end_event = True 
      event.Skip() 
     elif event_type == wx.wxEVT_KEY_DOWN: 
      key = event.GetKeyCode() 
      old_value = control.GetValue() 
      if key == wx.WXK_UP: 
       value = old_value + 1 
      elif key == wx.WXK_DOWN: 
       value = old_value - 1 
      control.SetValue(value) 
      value = control.GetValue() 
      if value != old_value: 
       self._has_spinned = True 
      if key == wx.WXK_DOWN: 
       value_string_length = len(str(value)) 
       control.SetSelection(value_length, value_string_length) 
     elif event_type == wx.wxEVT_KEY_UP: 
      if self._has_spinned: 
       is_spin_end_event = True 
     if is_spin_end_event: 
      self._has_spinned = False 
      index = self._controls.index(control) 
      self._event_handlers[index](event)