wx.lib.EVT_COLOURSELECT干扰wx.lib.FloatCanvas.EVT_MOUSEWHEEL

时间:2014-12-11 00:13:20

标签: python wxpython

问题:

似乎有一个事件正在禁用另一个事件。在调用事件B之前,事件A工作正常。事件B发生后,事件A不再起作用。这两个事件都是人们为他们的wxPython库(FloatCanvas和ColourSelect)制作的自定义事件。我想跟踪生成的事件,以确保在事件B之后,事件A仍然被触发(但可能没有触发处理程序代码?)

详情:

我有一个wxPython应用程序,我在其中创建一个带有两个子项的wx.Panel对象 - 一个情节和一个图例。这个顶级面板处理大多数事件。

  • 该图是一个wx.Panel对象,其中包含一个wx.lib.FloatCanvas.FloatCanvas画布。

  • 图例是wx.Panel,其中包含多个wx.StaticTextwx.lib.colourselect.ColourSelect个对象(我正在绘制离散数据点)。

在图中,我将FloatCanvas.EVT_MOUSEWHEEL绑定到我的放大/缩小功能。在图例上,我将wx.lib.colourselect.EVT_COLOURSELECT事件绑定到我的update_colors函数,然后通过wx.PostEvent(event)将事件发送到父面板。

父母小组然后从孩子那里收到EVT_COLOURSELECT并执行改变我的情节颜色的代码。

源代码:

我没有时间编写一个示例问题的小样本,但您可以通过运行源代码来查看问题: https://github.com/dougthor42/wafer_map

运行wm_app.py文件,然后执行以下测试步骤。

测试步骤:

  1. 滚动/放大和缩小 - 工作正常
  2. 更改绘图颜色(触发EVT_COLOURSELECT)。如果您使用源代码进行测试,请单击图例颜色框并选择新颜色。
  3. 尝试再次放大和缩小。 不能工作!
  4. 验证所有其他事件(按键,点击并拖动,鼠标移动)都能正常工作。
  5. 我试过的事情:

    显然这些没有用,否则我不会在这里:-P

    • 取消绑定鼠标滚轮事件,并在顶级面板收到来自孩子的事件时重新绑定它。

    • 在父面板和图例中完全禁用EVT_COLOURSELECT的处理程序。

      • 我想也许我的处理程序中可能发生了一些事情。事实证明,只是 触发EVT_COLOURSELECT会导致EVT_MOUSEWHEEL停止工作。
    • FloatCanvas.EVT_MOUSEWHEEL更改为其他一些事件,例如FloatCanvas.EVT_RIGHT_DOWN

      • 这确实有效!我放松了速度'来自鼠标滚轮的信息,但右键单击 在步骤2之前和之后都工作。
      • 似乎表明它特别是鼠标滚动事件的问题。

    有没有人遇到事件相互干扰的问题?

1 个答案:

答案 0 :(得分:0)

事实证明,事件没有任何干扰 - 至少不是我提到的事件。

经过大量的摆弄和尝试制作一个仍然表现出问题的裸机版本(我没有成功),我找出了根本原因。可悲的是,我没有找到解决方法。

问题:

我的情节wx.Panel是绑定wx.MOUSE_LEFT_DOWN。这似乎阻止了父wx.Frame窗口将焦点放在持有情节和图例的Panel上。

解决方案:

我删除了绑定到wx.EVT_LEFT_DOWN,这似乎解决了潜在的问题。但是,这仍然不是理想的情况,因为它会导致另外两个问题:

  1. 我不能再在剧情上使用我的鼠标左键。我想,这不是什么大问题,因为我总能绑定右键鼠标。
  2. 用户必须首先左键单击绘图区域,才能在鼠标滚动或任何键盘快捷键工作之前对其进行聚焦。这不一定源于不绑定wx.EVT_LEFT_DOWN,而是(我相信)来自Windows所做的事情。有关详细信息,请参阅Focus-follows-mouse in wxPython?
  3. 失败的解决方法:

    我尝试了一种解决方法:添加将wx.EVT_LEFT_DOWN事件发送给父级的代码但是仍然无效或者我做错了。这是我尝试过的左键单击事件处理程序:

    def left_click(self, event):
        print("left click!")
        parent = wx.GetTopLevelParent()
        wx.PostEvent(self.parent, event)
    

    所以无论如何,这个问题有点解决了。希望我在这里得到的帮助别人。