0

我正在使用 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。有趣的是,尽管树扩展错误(输入键),但项目选择(空格)根本不起作用。

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

提前致谢。

4

2 回答 2

1

首先,尝试自己在任何本机控件中处理键盘是个坏主意。只需完全删除您的EVT_KEY_DOWN处理程序并进行处理EVT_TREE_ITEM_ACTIVATED。这可以保证在所有平台上都有效,这与从本机控件中窃取事件不同,后者可能真的希望自己拥有它。

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

于 2012-09-18T09:29:35.980 回答
0

这就是为什么这个错误很有趣。我不设置任何数据项;我实际上尝试接收它。臭名昭著的行是我的两个脏活函数中的第一行:

ikey = self.GetPyData (item)

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

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

于 2012-09-18T09:59:11.653 回答