wxpython:Mouse Up事件触发错误

时间:2017-08-26 21:01:11

标签: wxpython mouseevent

我遇到了wx.EVT_LEFT_UP事件似乎错误的问题,或者至少我发现它非常违反直觉。

当我向下点击一个面板,按住按钮然后在其他面板上单击时触发一个功能,我想调用一个函数。

请考虑以下代码:

import wx

class Example(wx.Frame):
    def __init__(self, *args, **kwargs):
        super(Example, self).__init__(*args, **kwargs)

        panel = wx.Panel(self)

        # left panel
        lPan = wx.Panel(panel)
        lPan.SetBackgroundColour('#9C4141')
        lPan.Bind(wx.EVT_LEFT_DOWN, lambda e, p='left': self.onLeftDown(e, p))
        lPan.Bind(wx.EVT_LEFT_UP, lambda e, p='left': self.onLeftUp(e, p))

        # right panel
        rPan = wx.Panel(panel)
        rPan.SetBackgroundColour('#415C9C')
        rPan.Bind(wx.EVT_LEFT_DOWN, lambda e, p='right': self.onLeftDown(e, p))
        rPan.Bind(wx.EVT_LEFT_UP, lambda e, p='right': self.onLeftUp(e, p))

        # box sizer
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        hbox.Add(lPan, 1, flag=wx.EXPAND)
        hbox.Add(rPan, 1, flag=wx.EXPAND)
        panel.SetSizer(hbox)

        self.Show()

    def onLeftDown(self, e, panel):
        print('Mouse down on {} panel'.format(panel))

    def onLeftUp(self, e, panel):
        print('Mouse up on {} panel'.format(panel))

if __name__ == '__main__':
    app = wx.App()
    Example(None, title='Down and Up click', size=(200, 150))
    app.MainLoop()

这会起作用,例如使用JavaScript就好了,因为Element绑定到事件会对Down和Up点击做出独立反应。但是,似乎Up事件仅针对之前单击的面板触发。 (见图)。

enter image description here

如您所见,左侧面板而不是右侧面板触发了Up事件。有人对此有解释吗?

1 个答案:

答案 0 :(得分:1)

正如nepix32所指出的,这可能是与macOS相关的实现错误,所以我尝试以下解决方法。

鼠标输入和离开被准确检测到,所以我想我绑定它们来跟踪最新输入的面板并将其存储在父级中。要在任何面板上单击鼠标,我会处理我想对存储的面板执行的任何操作。

这就是我的意思(按预期工作):

2

enter image description here