在打开的wx.ComboCtrl中接收击键

时间:2009-01-21 10:22:42

标签: event-handling wxpython wxwidgets

来自this question,我有一个wxComboCtrl,其自定义弹出窗口由一组带有一组radiobuttons的面板组成。我的问题是,当我打开弹出窗口时,组合不会得到击键,因为事件由面板本身处理..我想将这些KeyEvents重定向到组合的textctrl,但我找不到让它工作的方法:/
我走错了路吗?当用户按下键时,我应该手动处理textctrl值吗?我认为这会有点麻烦..因为据说textctrl已经知道如何处理这些事件..

这是我的测试用例(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"

1 个答案:

答案 0 :(得分:0)

我得到了罗宾·邓恩本人对wxpython-users的回答:

  

将低级别事件发送给本机   像这样的小部件不起作用   大多数人都期望的方式。   你期待这会导致   要添加到文本中的字符   ctrl,但它不能这样做,因为所有   ProcessEvent发送的是   wx.Event到任何绑定的事件处理程序   然后停止它没有去   下一步并转换该事件   到等效的本机消息和   将其发送到本机小部件。看到   “模拟键盘事件”   线程。

     

它不能很好地工作   非Windows平台,但你可以   尝试改为调用EmulateKeypress。