wxpython:将光标设置为绝对屏幕位置,然后单击

wxpython:将光标设置为绝对屏幕位置,然后单击,python,wxpython,mouse,Python,Wxpython,Mouse,我很难找到适合我的工作。我尝试做的场景类似于记录用户的点击,然后在屏幕上重播。我能够记录屏幕的运动和点击,没有任何问题;然而,我在重放用户录制的内容时遇到了障碍 def MoveCursorAndClick(self, e): # get the current screen position sp = self.GetPosition() p = self.getNextPosition() # returned in absolute x,y from screen

我很难找到适合我的工作。我尝试做的场景类似于记录用户的点击,然后在屏幕上重播。我能够记录屏幕的运动和点击,没有任何问题;然而,我在重放用户录制的内容时遇到了障碍

def MoveCursorAndClick(self, e):
    # get the current screen position
    sp = self.GetPosition()
    p = self.getNextPosition() # returned in absolute x,y from screen rec
    self.WarpPointer(p.x - sp[0], p.y - sp[1])
    # wx.PostEvent(EVT_LEFT_DOWN, self.GetId())
显然,上面的代码是不正确的,因为WarpPointer似乎只在窗口中工作,而不是在全屏上。尝试将功能窗口的坐标偏移也证明是很麻烦的,因为它们似乎总是在Y方向偏移约50 pix。我目前唯一的假设是,我正在使这件事变得比它需要的更难,而且由于我对wxpython缺乏经验,我没有看到更好的原因

此外,被破坏的PostEvent行是我在google上搜索到的唯一一个看起来是正确的东西,它可以将鼠标点击发送到另一个窗口,也可以不发送到另一个窗口。这是正确的方向吗

已更新 正如下面提到的,没有一个好的跨平台方法来实现这一点。以下是我所做的(在互联网上找到了很多地方):


我不认为你一个人能在wxPython做到这一点。正如您所发现的,只能将鼠标移动到由该窗口控制的区域。类似地,您正在
wx.EVT\u LEFT\u DOWN
调用将不起作用,因为您正在为窗口设置ID,这意味着它是被单击的窗口,而不是(x,y)处的单击

在稍微搜索了一下之后,我发现breifly谈到了GUI级别的测试。这并不是你想要做的,但在概念上是相似的。他们建议使用外部库来操作接口。他们注意到的关于这种方法的主要问题是,大多数用于模拟GUI交互的工具都有公司许可证和/或平台依赖性

那篇文章建议使用Windows系统。为了你的目的,似乎有你需要的方法<代码>移动鼠标()和
单击()。如果您不使用Windows或需要跨平台支持,则需要研究不同的库


基本上,您需要将pywinauto安装并导入到wxPython应用程序中,并调用其方法,而不是wxPython的方法。只要跨平台兼容性不是一个问题,我认为这是您最简单、最好的解决方案。

我不认为您可以单独在wxPython中实现这一点。正如您所发现的,只能将鼠标移动到由该窗口控制的区域。类似地,您正在
wx.EVT\u LEFT\u DOWN
调用将不起作用,因为您正在为窗口设置ID,这意味着它是被单击的窗口,而不是(x,y)处的单击

在稍微搜索了一下之后,我发现breifly谈到了GUI级别的测试。这并不是你想要做的,但在概念上是相似的。他们建议使用外部库来操作接口。他们注意到的关于这种方法的主要问题是,大多数用于模拟GUI交互的工具都有公司许可证和/或平台依赖性

那篇文章建议使用Windows系统。为了你的目的,似乎有你需要的方法<代码>移动鼠标()
单击()。如果您不使用Windows或需要跨平台支持,则需要研究不同的库


基本上,您需要将pywinauto安装并导入到wxPython应用程序中,并调用其方法,而不是wxPython的方法。只要跨平台兼容性不是问题,我认为这是最简单、最好的解决方案。

wxPython仅在光标位于wxPython生成的窗口、框架或小部件上时才控制光标。当您离开wxPython应用程序的限制时,它将失去对鼠标的控制。此时,您必须连接到操作系统。在Windows上,PyWin32软件包可能是最好的选择


还有一个叫做sikuli的很酷的小项目,如果你能想出如何拍摄屏幕截图的话,它可能也会起作用:

wxPython只在光标位于wxPython生成的窗口、框架或小部件上时才控制光标。当您离开wxPython应用程序的限制时,它将失去对鼠标的控制。此时,您必须连接到操作系统。在Windows上,PyWin32软件包可能是最好的选择


还有一个叫做sikuli的很酷的小项目,如果你能想出如何拍摄屏幕截图的话,它可能也会起作用:

我已经创建了开源应用程序JW_Record_Playback,在python wxwindows中用作记录播放机制。它实际上使用TK/TCL作为外部资源。它在Linux上运行良好(在Suse和Ubuntu发行版中都进行了测试)


请检查:

我已经创建了开源应用程序JW_Record_Playback,用作python wxwindows中的记录播放机制。它实际上使用TK/TCL作为外部资源。它在Linux上运行良好(在Suse和Ubuntu发行版中都进行了测试)


请检查:

我两次都试过了,但运气都不好。遗憾的是,你是对的,没有任何好的x平台方法可以做到这一点。下面是我最后做的(在互联网上找到了其他几个地方):def click(self,x,y):win32api.SetCursorPos((x,y))win32api.mouse_事件(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0)win32api.mouse_事件(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0)很抱歉我帮不上忙。我很高兴你能找到一些有用的东西,即使有时候它不是跨平台的。。。这就是它滚动的方式;但是也许一些有冒险精神的程序员会把它作为他们未来的任务来解决:)我尝试了这两种方法,但运气都不好。可悲的是,你说得对,其实没有什么好处
def ClickScreenPositon(self, x, y):
    win32api.SetCursorPos((x,y))
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0)