【发布时间】:2012-09-17 20:59:02
【问题描述】:
我正在使用 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 的默认键盘事件处理?
提前致谢。
【问题讨论】:
-
你为什么不使用
wx.WXK_RETURN?并尝试将wx.PROCESS_ENTER添加到树控件的样式参数中? (注意,我不确定两者都行得通……但也许……) -
你能发布一个完整(但简短!)的代码示例吗?包括应用程序设置和框架布局。 ..这是任何人真正尝试复制您的问题的唯一方法:)
-
恐怕你要的是不可能的事。我还没有对文件 I/O 进行编码,并且我在大约 100 行中对树数据进行了完整定义(考虑到具体情况,实际上有 8 个树小部件交换到位......我想我应该重新考虑这个想法)。如果你真的喜欢它,也许可以在 troton1927_at_o2.pl 给我发邮件,我会给你提供代码。
-
您几乎肯定应该重新考虑这个想法...用一个树小部件制作一个较小的示例并发布整个代码...如果您愿意,可以将其发布到其他地方并链接它...我假设你可以用不到 40 行代码来做一个例子……
-
否定。我为我的盆景小部件分配了很小的框架空间,所以我一次只能加载一个级别的孩子。因此,我必须将树结构存储在我自己的字典中。因此,如果我必须满足您的愿望,我至少必须转储所有 100 多行代码。我不知道 Stack Overflow 是否会忍受这一点。允许转储?