来自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"
答案 0 :(得分:0)
我得到了罗宾·邓恩本人对wxpython-users的回答:
将低级别事件发送给本机 像这样的小部件不起作用 大多数人都期望的方式。 你期待这会导致 要添加到文本中的字符 ctrl,但它不能这样做,因为所有 ProcessEvent发送的是 wx.Event到任何绑定的事件处理程序 然后停止它没有去 下一步并转换该事件 到等效的本机消息和 将其发送到本机小部件。看到 “模拟键盘事件” 线程。
它不能很好地工作 非Windows平台,但你可以 尝试改为调用EmulateKeypress。