处理wxWidgets事件期间的一个有趣错误

时间:2012-09-17 20:59:03

标签: python events wxwidgets

我正在使用wxWidgets库编写一些Windows应用程序,并且我坚持一些有趣的事情:

    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代码。有趣的是,树扩展的错误(输入密钥),但项目selsction(空格)根本不起作用。

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

提前致谢。

2 个答案:

答案 0 :(得分:1)

首先,尝试自己处理任何原生控件中的键盘是一个错误的想法。只需完全删除EVT_KEY_DOWN处理程序,然后处理EVT_TREE_ITEM_ACTIVATED。这保证可以在所有平台上运行,而不像从本机控件窃取事件,这可能真的想要自己拥有它。

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

答案 1 :(得分:0)

这就是错误有趣的原因。我没有设置任何数据项;我实际上试着接收它。发臭的线是我的两个脏功能中的第一个:

ikey = self.GetPyData (item)

我真的不知道发生了什么以及为什么wxWidgets引擎会尝试将一些数据分配给项目。我向Google叔叔询问了这个错误,但我没有获得有用的信息。

感谢您对键盘操作的评论。