Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
wxpython:鼠标向上事件触发错误_Wxpython_Mouseevent - Fatal编程技术网

wxpython:鼠标向上事件触发错误

wxpython:鼠标向上事件触发错误,wxpython,mouseevent,Wxpython,Mouseevent,我遇到了一个问题,wx.EVT_LEFT_UP事件似乎触发错误,或者至少,我发现它非常违反直觉 我想在向下单击一个面板时调用一个函数,按住按钮,然后在向上单击另一个面板时启动一个函数 考虑以下代码: import wx class Example(wx.Frame): def __init__(self, *args, **kwargs): super(Example, self).__init__(*args, **kwargs) panel = w

我遇到了一个问题,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来说,这很好,因为绑定到事件的元素会独立地对向下和向上的点击做出反应。然而,在这里,Up事件似乎只针对之前单击过的面板触发。(见图)


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

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

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

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


您好,在Windows上,无论是在2.7/wxPython 2.9还是在3.6.2/wxPython 4.0上,您的示例都能按预期工作(左下/右上)。您可以使用,在进入主循环之前插入两个内衬,浏览面板并激活事件查看器以实时查看两个面板的所有事件。感谢inspector的提示。我使用了它,对我来说,在拖动后的右面板上实际上没有鼠标向上移动事件(或除motion和setcursor之外的其他事件)。我还使用了wxPython 4版本(确切地说是“4.0.0b1 osx cocoa(phoenix)”),因此这似乎是macOS的一个实现错误。从我所能确定的情况来看,一旦你点击
down
,事件就会锁定到点击的小部件上,用于
click
目的。您将获得
输入
加上
离开
运动
等,这是正确的,但鼠标
向上
仍锁定到原始鼠标
向下
小部件。您可以通过检查事件的
Id
Name
来检查这一点。您的解决方案将适用于2个面板,因为它是or,但如果您尝试为2个以上的面板实施解决方案,则必须尝试确定光标相对于面板位置的位置,这可能会很复杂。(LinuxWX3.0.2.0GTK2(经典))我已经编辑了我的答案以给出一个示例。它适用于多个面板。你能检查一下这在Linux上是否有效吗?我真的需要它在所有桌面平台上工作。不,它失败了。输入左,鼠标左下,鼠标左上,实际向上。当点击左侧并在中间发布时,感谢您的反馈。在3个不同的操作系统上看到3种不同的事件行为非常令人沮丧:-(
#!/usr/bin/env python
import wx
#import wx.lib.inspection

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

        # parent for left and right panels
        panel = wx.Panel(self)
        panel.SetBackgroundColour('#759538')

        self.lastEntered = None

        hbox = wx.BoxSizer(wx.HORIZONTAL)
        # setup some child panels
        for name in ['left', 'middle', 'right']:
            pan = wx.Panel(panel, name=name)
            pan.SetBackgroundColour('#404040')
            # bind events
            pan.Bind(wx.EVT_LEFT_DOWN, self.onLeftDown)
            pan.Bind(wx.EVT_LEFT_UP, self.onLeftUp)
            pan.Bind(wx.EVT_ENTER_WINDOW, self.onEnter)
            # put in sizer
            hbox.Add(pan, 1, flag=wx.EXPAND|wx.ALL, border=5)

        panel.SetSizer(hbox)
        self.Show()

    def onLeftDown(self, e):
        panel = e.GetEventObject()
        print('Mouse down on '+panel.GetName())

    def onLeftUp(self, e):
        panel = e.GetEventObject()
        print('Mouse up on '+panel.GetName())
        # the actual up panel
        if self.lastEntered:
            print('Actual up on '+self.lastEntered.GetName())

    def onEnter(self, e):
        panel = e.GetEventObject()
        self.lastEntered = panel
        print('Entered '+panel.GetName())

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