【问题标题】:wx.lib.EVT_COLOURSELECT interfering with wx.lib.FloatCanvas.EVT_MOUSEWHEELwx.lib.EVT_COLOURSELECT 干扰 wx.lib.FloatCanvas.EVT_MOUSEWHEEL
【发布时间】:2015-02-09 08:51:31
【问题描述】:

问题:

似乎一个事件正在禁用另一个事件。在调用事件 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 并执行更改我的绘图颜色的代码。

源代码:

我还没来得及写一个demo的小例子,但是你可以通过运行源代码看到问题: https://github.com/dougthor42/wafer_map

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

测试步骤:

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

我尝试过的事情:

显然这些都不起作用,否则我不会在这里:-P

  • 当顶层面板收到子事件时,解除鼠标滚轮事件的绑定并重新绑定。

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

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

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

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

【问题讨论】:

  • 你能展示你的事件处理程序吗?或者更好的是显示问题的独立样本。
  • 我现在没有时间编写显示问题的示例,但您可以在github.com/dougthor42/wafer_map 查看项目的源代码。运行 wm_app.py,然后运行上面列出的测试步骤。我对它们进行了编辑,使其更具描述性。

标签: python wxpython


【解决方案1】:

事实证明,事件并没有受到任何干扰——至少我提到的事件没有。

经过大量的摆弄和尝试制作仍然显示问题的准系统版本(我没有成功),我找到了根本原因。遗憾的是,我没有找到解决方法。

问题:

我的情节 wx.Panel 绑定了wx.MOUSE_LEFT_DOWN。似乎这阻止了父 wx.Frame 窗口将焦点放在保存绘图和图例的面板上。

解决方案:

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

  1. 我无法再在绘图上使用鼠标左键。我想没什么大不了的,因为我总是可以绑定鼠标右键。
  2. 用户必须先左键单击绘图区域以使其获得焦点,然后鼠标滚动或任何键盘快捷键才会起作用。这不一定源于不绑定wx.EVT_LEFT_DOWN,而是(我相信)源于Windows所做的事情。请参阅Focus-follows-mouse in wxPython? 了解更多信息。

失败的解决方法:

我尝试了一种解决方法:添加将 wx.EVT_LEFT_DOWN 事件发送到父级的代码,但要么仍然不起作用,要么我做错了。这是我尝试过的左键事件处理程序:

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

不管怎样,这个问题已经解决了。希望我在这里得到的东西可以帮助其他人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-17
    • 2019-06-17
    • 2015-02-12
    • 2011-04-02
    • 2020-04-01
    • 2017-08-27
    • 2012-11-02
    • 1970-01-01
    相关资源
    最近更新 更多