【问题标题】:An interesting error during processing wxWidgets event处理 wxWidgets 事件期间的一个有趣错误
【发布时间】: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 是否会忍受这一点。允许转储?

标签: python events wxwidgets


【解决方案1】:

首先,尝试自己在任何本机控件中处理键盘是一个糟糕的想法。只需完全删除您的EVT_KEY_DOWN 处理程序并处理EVT_TREE_ITEM_ACTIVATED。这保证在所有平台上都有效,不像从本机控件中窃取事件可能真的想要自己拥有它。

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

【讨论】:

    【解决方案2】:

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

    ikey = self.GetPyData (item)
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-27
      • 2011-01-31
      • 2014-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多