2012-09-17 19 views
0

我编码使用wxWidgets库的某些Windows应用程序,我已经被困在一些有趣的事情在一个有趣的错误:处理wxWidgets的事件

def HandleDblclick (self, event): 
     self.ItemActivation (event.GetItem()) 

    def HandleKeydown (self, event): 
     keyc = event.GetKeyCode() 
     if keyc == 13: 
      self.ItemActivation (event.GetItem()) 
     elif keyc == 32: 
      self.ItemSelection (event.GetItem()) 
     self.sbar.SetStatusText (str (keyc) + " was pressed.") 

    def HandleRclick (self, event): 
     self.ItemSelection (event.GetItem()) 

(是的,这是Python的)。 ItemActivation()和ItemSelection()完​​成所有肮脏的工作。但只有当我按下鼠标按钮。当我输入一个密钥时,我得到以下输出:

File "C:\Python27\lib\site-packages\wx-2.8-msw-unicode\wx\_controls.py", line 5315, in GetItemPyData 
return _controls_.TreeCtrl_GetItemPyData(*args, **kwargs) 
wx._core.PyAssertionError: C++ assertion "param" failed at ..\..\src\msw\treectrl.cpp(1083) in wxTreeCtrl::SetItemData(): failed to change tree items data 

我想编码一个TreeCtrl。有趣的是,树扩展的错误(输入键),但项目选择(空间)完全不起作用。

发生了什么,为什么?我认为wxWidgets尝试两次处理事件,一次使用默认处理程序,两次使用我的事件。但如果我是正确的,如何禁用wx.TreeCtrl的默认键盘事件处理?

在此先感谢。

+0

为什么不使用'wx.WXK_RETURN'?并尝试将'wx.PROCESS_ENTER'添加到树形控件的style参数上? (注意,即时通讯不知道要么工作...但也许..) –

+0

可悲的是,它没有 – user1658903

+0

你可以发布一个完整的(但简短!)代码示例?包括应用程序设置和框架布局。 ..多数民众赞成在任何人都会真正尝试和复制你的问题的唯一方法:) –

回答

1

首先,这是一个不好的想法尝试自己处理任何本地控制键盘。请完全删除您的EVT_KEY_DOWN处理程序,并改为处理EVT_TREE_ITEM_ACTIVATED。这可以保证在所有平台上都能正常工作,这与窃取本机控制中可能真正需要的事件不同。

其次,关于SetItemData()失败的错误似乎与您显示的代码没有任何关系,因为它根本不调用该函数。所以你不能向我们展示所有相关的部分。

0

这就是为什么错误很有趣。我不设置任何数据项;我其实尝试接收它。发臭该生产线是在我的两个dirtywork功能的第一个:

ikey = self.GetPyData (item) 

我真的不知道发生了什么事情,为什么wxWidgets的引擎会尝试一些数据分配给项目。我问谷歌叔叔这个错误,但我没有得到任何有用的信息。

感谢您对键盘处理的评论。