Python wx.lib.EVT_颜色选择干扰wx.lib.FloatCanvas.EVT_鼠标滚轮 问题是:

Python wx.lib.EVT_颜色选择干扰wx.lib.FloatCanvas.EVT_鼠标滚轮 问题是:,python,wxpython,Python,Wxpython,似乎一个事件正在禁用另一个事件。在调用事件B之前,事件A工作正常。事件B触发后,事件A不再工作。这两个事件都是人们为其wxPython库(FloatCanvas和colorSelect)定制的事件。我希望跟踪生成的事件,以确保在事件B之后,事件A仍然被触发(但可能没有触发处理程序代码?) 详情如下: 我有一个wxPython应用程序,我在其中创建了一个wx.Panel对象,其中包含两个子项—一个绘图和一个图例。此顶级面板处理大多数事件 绘图是一个wx.Panel对象,其中有一个wx.lib.F

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

详情如下: 我有一个wxPython应用程序,我在其中创建了一个
wx.Panel
对象,其中包含两个子项—一个绘图和一个图例。此顶级面板处理大多数事件

  • 绘图是一个
    wx.Panel
    对象,其中有一个
    wx.lib.FloatCanvas.FloatCanvas
    画布

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

在绘图上,我将
FloatCanvas.EVT_mouseweel
绑定到我的放大/缩小功能。在图例上,我将
wx.lib.colorselect.EVT\u colorselect
事件绑定到我的update\u colors函数,然后该函数通过
wx.PostEvent(event)
将事件发送到父面板

然后,父面板从子面板接收
EVT\u colorselect
,并执行更改绘图颜色的代码

源代码: 我还没来得及编写一个小示例来说明演示的问题,但您可以通过运行源代码来查看问题:

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

测试步骤:
  • 滚动/放大和缩小-工作正常
  • 更改打印颜色(激发
    EVT\u colorselect
    )。如果要使用源代码进行测试,请单击图例颜色框并选择新颜色
  • 再次尝试放大和缩小不起作用
  • 确认所有其他事件(按下键、单击并拖动、鼠标移动)都正常工作
  • 我尝试过的事情: 显然,这些都不起作用,否则我就不会在这里了

    • 解除鼠标滚轮事件的绑定,并在顶级面板收到来自子级的事件时重新绑定

    • 完全禁用父面板和图例中的
      EVT\u colorselect
      处理程序

      • 我想也许我的经纪人有什么问题。结果,只是 触发
        EVT\u colorselect
        会导致
        EVT\u鼠标滚轮
        停止工作
    • FloatCanvas.EVT\u鼠标滚轮更改为其他事件,例如
      FloatCanvas.EVT\u RIGHT\u DOWN

      • 这确实有效!我松开了鼠标滚轮上的“速度”信息,但右键单击 在第2步之前和之后,这两种方法都有效
      • 似乎表明这是鼠标滚动事件的问题

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

    事实证明,事件之间没有任何干扰,至少我提到的事件没有

    在做了大量的修改和尝试后,我找到了问题的根源。遗憾的是,我没有找到解决办法

    问题是: 我的绘图wx.Panel已绑定
    wx.MOUSE\u LEFT\u DOWN
    。这似乎阻止了父wx.Frame窗口将焦点放在保存绘图和图例的面板上

    解决方案: 我删除了对
    wx.EVT\u LEFT\u的绑定,这似乎解决了根本问题。但是,这仍然不是理想情况,因为它会导致另外两个问题:

  • 我不能再在绘图上使用鼠标左键。我想这没什么大不了的,因为我总能绑住鼠标
  • 在鼠标滚动或任何键盘快捷键工作之前,用户必须首先左键单击绘图区域以使其具有焦点。这不一定源于没有绑定wx.EVT\u LEFT\u
  • ,而是(我相信)源于Windows所做的一些事情。有关更多信息,请参阅 失败的解决方法: 我尝试了一种解决方法:添加代码,将wx.EVT_LEFT_DOWN事件发送到父级,但这仍然不起作用,或者是我做错了。以下是我尝试的左键单击事件处理程序:

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

    不管怎样,这个问题已经解决了。希望我这里的内容能帮助其他人解决问题。

    您能展示一下您的事件处理程序吗?或者最好是一个显示问题的自包含示例。我现在没有时间编写一个显示问题的示例,但是您可以在上查看项目的源代码。运行wm_app.py,然后运行上面列出的测试步骤。我对它们进行了编辑,使其更具描述性。