【问题标题】:Prevent mouse from hitting window/screen boundaries in wxPython防止鼠标在 wxPython 中击中窗口/屏幕边界
【发布时间】:2014-10-12 20:28:52
【问题描述】:

我正在使用 wxPython 和 OpenGL 窗格制作第一人称/相机视图,并且我想使用鼠标移动来控制相机角度。为此,我需要在每帧 x,y 中移动鼠标。

我在其他环境中执行此操作的方式是将光标移动到每帧末尾的屏幕中心,在抓取移动数据之后 - 这样它就永远不会远离中心并且超出窗口范围。

我找到了 wx.WarpPointer(x,y),它可以满足我的要求 - 除了它还发送 EVT_MOTION,据我所知,它与真实的鼠标运动相同。所以它只是将视图移回到它开始的地方。

有什么方法可以区分 WarpPointer 和用户输入的鼠标事件吗?或者在 WarpPointer 上巧妙地绑定到不同的函数和 StopPropagation 的方法,然后才能影响此帧的鼠标移动?

或者,在 wxPython 中是否有另一种方法可以做到这一点? CaptureMouse 看起来不错,但它只是将指针锁定在窗口内而不是屏幕边界。

【问题讨论】:

    标签: opengl wxpython mouseevent wxwidgets


    【解决方案1】:

    在调用 WarpPointer 之前设置一个标志,并在您的 EVT_MOTION 处理程序中检查该标志并相应地继续并重置该标志。

    def SomeMethod(self):
        self.isWarping = True
        wx.WarpPointer(x, y)
    
    def OnMotion(self, evt):
        if self.isWarping:
            self.isWarping = False
            do something
        else:
            do something else
    

    【讨论】:

    • 我试过了,没有运气 - iswarping 标志总是假的。我认为 WarpPointer 调用实际上可能会乱序运行,就像它是线程化的一样。如果我想移动鼠标 > 停止移动 > 向后弯曲就可以了,但我需要不断移动。
    • iswarping always False 如果您设置了此标志,则没有意义。您定义为“self.iswarping”,对吧?
    • 是的;在绑定到 evt_motion 的 OnMotion 函数的末尾: self.iswarping=True;self.WarpPointer(0,0);self.iswarping=False - 每个运动事件都将 iswarping 设为 False。似乎 WarpPointer 为下一帧或其他东西注册了动作......
    • 你只是设置/重置它,你不检查它?在 OnMotion 中你会做 Warp 吗?请参阅我所期望的编辑答案。
    • 不,我一直在检查它;没运气。我认为 WarpPointer 实际上移动超过一帧? pastebin.com/kJZQMHZR
    猜你喜欢
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多