2009-01-21 39 views
0

來自this question,我有一個wxComboCtrl自定義彈出式面板與一堆單選按鈕組成的面板..我的問題是,當我打開彈出組合鍵沒有得到擊鍵,因爲這些事件是由面板本身處理的。我想將這些KeyEvent重定向到組合的文本控件,但是我找不到一種方法讓它起作用:/
我會錯誤的方式?我應該在用戶按鍵時手動處理textctrl值嗎?我認爲這是有點麻煩,但..由於按說textctrl已經知道如何處理這些事件..在打開的wx.ComboCtrl中接收鍵擊

這裏是我的測試用例(在Linux上的wxPython 2.8),該「on_key」方法應該是罪魁禍首:

import wx 
import wx.combo 

class CustomPopup(wx.combo.ComboPopup): 

    def Create(self, parent): 
     # Create the popup with a bunch of radiobuttons 
     self.panel = wx.Panel(parent) 
     sizer = wx.GridSizer(cols=2) 
     for x in range(10): 
      r = wx.RadioButton(self.panel, label="Element "+str(x)) 
      r.Bind(wx.EVT_RADIOBUTTON, self.on_selection) 
      sizer.Add(r) 
     self.panel.SetSizer(sizer) 

     # Handle keyevents 
     self.panel.Bind(wx.EVT_KEY_UP, self.on_key) 

    def GetControl(self): 
     return self.panel 

    def GetAdjustedSize(self, minWidth, prefHeight, maxHeight): 
     return wx.Size(200, 150) 

    def on_key(self, evt): 
     if evt.GetEventObject() is self.panel: 
      # Trying to redirect the key event to the combo.. But this always returns false :(
      print self.GetCombo().GetTextCtrl().GetEventHandler().ProcessEvent(evt) 
     evt.Skip() 

    def on_selection(self, evt): 
     self.Dismiss() 
     wx.MessageBox("Selection made") 


class CustomFrame(wx.Frame): 

    def __init__(self): 
     # Toolbar-shaped frame with a ComboCtrl 
     wx.Frame.__init__(self, None, -1, "Test", size=(800,50)) 
     combo = wx.combo.ComboCtrl(self) 
     popup = CustomPopup() 
     combo.SetPopupControl(popup) 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(combo, 0) 
     self.SetSizer(sizer) 
     self.Layout() 

if __name__ == '__main__': 
    app = wx.PySimpleApp() 
    CustomFrame().Show() 
    app.MainLoop() 

編輯:
我發現了同一主題的這些(未解決)討論..
"ComboCtrl loses keyboard focus when ComboPopup is shown "
"issue using wx.ComboCtrl"

回答

0

我已經有了wxPython的用戶羅賓鄧恩自己的答案:

發送低級別事件爲本地 部件這樣不起作用 方式,大多數人指望它。 是因爲processEvent方法做了所有 是發送 wx.Event任何綁定的事件處理程序 ,然後停止你期待這導致 被添加到文本 CTRL字符,但它不能做。下一步它不會轉到 ,並將該事件 轉換爲等效本地消息,然後 將其發送到本機窗口小部件。請參閱 的「模擬鍵盤事件」 線程。

它不能在 非Windows平臺上工作得特別好,但你可以嘗試調用EmulateKeypress來代替 。

+0

羅賓鄧恩是DA MAN! – 2009-03-04 17:38:05

相關問題