2012-02-27 3 views
1

Я написал wxTreeCtrl, где я хочу обрабатывать коды ключей между 65 и 90 (Ascii: A-Z). И я не хочу обрабатывать любые другие коды ключей самостоятельно. После того как я обработал ключи между 65 и 90, как я могу прервать свое событие и использовать стандартный «ключ вниз» -эвенд для wxTreeCtrl?Переопределить событие KeyDown в wxPython

Определение класса:

class ConfigTreeCtrl(wx.TreeCtrl): 

Метод связывания:

self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown, self) 

Определение метода:

def OnKeyDown(self, event):   
    now = time.time() 
    keyCode = event.GetKeyCode() 
    if (keyCode >= 65 and keyCode <= 90) or (keyCode >= 48 and keyCode <= 57): 
     if self.searchString == "": 
      self.searchString = chr(event.GetKeyCode()) 
     elif (now - self.lastKeyDown) < 2: 
      self.searchString += str(chr(event.GetKeyCode())) 
     else: 
      self.searchString = str(chr(event.GetKeyCode())) 
    self.lastKeyDown = now 
    self.GetItem(self.searchString, self.GetRootItem()) 

Спасибо за вашу помощь и наилучшими пожеланиями

Томас

ответ

1

event.Skip() обрабатывает событие далее либо в базовом классе wxWindows, либо в собственном элементе управления. Поэтому в вашем методе необходимо ввести что-то вроде этого:

def OnKeyDown(self, event):   
    now = time.time() 
    keyCode = event.GetKeyCode() 
    if (keyCode >= 65 and keyCode <= 90) or (keyCode >= 48 and keyCode <= 57): 
     if self.searchString == "": 
      self.searchString = chr(event.GetKeyCode()) 
     elif (now - self.lastKeyDown) < 2: 
      self.searchString += str(chr(event.GetKeyCode())) 
     else: 
      self.searchString = str(chr(event.GetKeyCode())) 
    else: 
     event.Skip() 
     return 
    self.lastKeyDown = now 
    self.GetItem(self.searchString, self.GetRootItem()) 
+0

Я уже пробовал это. Когда я печатаю символы, выбор изменения работает правильно. Но когда я нажимаю клавиши со стрелками, это действительно странное поведение. Когда я вырабатываю исключение в инструкции else, дерево ведет себя так, как я хочу. Кажется, что я должен прервать обработку событий. – Thomas

+1

Тогда вы можете просто вернуться после event.Skip, см. Редактирование –

+0

Большое спасибо. Теперь он работает нормально;) – Thomas

Смежные вопросы