2010-03-08 5 views
1

Следующие ключевые события не работают. Есть идеи?Проблема с ключевыми событиями Escape в wxPython?

class Frame(wx.Frame): 

    def __init__(self): 
     wx.Frame.__init__(self, None, -1, title='testing', size=(300,380),      style=                      wx.MINIMIZE_BOX|wx.SYSTEM_MENU 
                          |wx.CAPTION|wx.CLOSE_BOX|wx.CLIP_CHILDREN) 

     self.tree = HyperTreeList(self, style = wx.TR_DEFAULT_STYLE | 
               wx.TR_FULL_ROW_HIGHLIGHT | wx.TR_HAS_VARIABLE_ROW_HEIGHT | wx.TR_HIDE_ROOT) 

     # create column 
     self.tree.AddColumn("coll") 

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

def OnKeyDown(self, event): 
     keycode = event.GetKeyCode() 
     print "keycode ", keycode 
     if keycode == wx.WXK_ESCAPE: 
      print "closing" 
      self.Close() 

С уважением,

+0

Что означает «не работает»? Отображается ли ключевой код? – Oddthinking

+0

№. Когда я нажимаю Escape Key, ничего не происходит. Я также пробовал другой ключ, но не успел. – MA1

ответ

2

Проблема здесь в том, что фокус принимается дерево CNTRL, и, следовательно, все KeyEvent идти к ней не мэйнфреймы, следовательно, связывание с мэйнфреймов не работает. Таким образом, первым инстинктом будет привязка к дереву cntrl, например.

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

но также не будет работать, дерево само по себе состоит из двух дочерних окон, окна заголовка и основного окна, видя код HyperTreeList, что будет работать в этой

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

Но это выглядит неэлегантно и полагается на внутренние детали HyperTreeList, а _main_win, который получен из CustomTreeCntrl, сам использует это событие, поэтому вы также должны быть осторожны с улавливанием таких событий.

+0

Спасибо Anurag, но почему мэйнфрейм не ловит события? Я связываю событие с мэйнфреймом, так почему дерево управления вмешивается в событие? – MA1