wxpython:将光标设置为绝对屏幕位置并单击

时间:2012-06-12 04:42:44

标签: python wxpython mouse

我在尝试让WarpPointer为我做适当的工作时遇到了一些麻烦。我正在尝试的方案类似于记录用户的点击,然后在屏幕上重播它们。我已经能够毫无问题地记录屏幕动作和点击;但是,当重播用户录制的内容时,我感到磕磕绊绊。

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像素。我目前唯一的假设是,我正在努力实现这一目标,而且由于我对wxpython缺乏经验,我没有看到更好的原因。

此外,破坏的PostEvent系列是我唯一设法谷歌的东西,看起来像是将鼠标点击发送到可能是也可能不是另一个窗口的东西是正确的。那是不是正确的方向?

更新 如下所述,没有一个很好的跨平台方法来实现这一目标。这就是我所做的(在互联网上找到了不同的地方):

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)

3 个答案:

答案 0 :(得分:3)

我认为你不能单独在wxPython中这样做。正如您所发现的那样,wx.Window.WarpPointer()只能将鼠标移动到该窗口控制的区域。同样地,您wx.EVT_LEFT_DOWN调用将无效,因为您正在将ID设置为窗口,这意味着它是单击的窗口,而不是(x,y)处的单击。

经过一些轻微的谷歌搜索后,我发现this article on Unit Testing in wxPython在GUI级别上进行了严格的测试。这不是你想要做的,但它在概念上类似。他们建议使用外部库来操作界面。他们关于这种方法的主要问题是,用于模拟GUI交互的大多数工具都是在公司许可和/或平台相关的情况下。

该文章建议在Windows系统中使用pywinauto。出于您的目的,pywinauto.controls.HwndWrapper似乎有您需要的方法; MoveMouse()Click()。如果您不使用Windows或需要跨平台支持,则需要研究不同的库。

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

答案 1 :(得分:1)

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

还有一个名为sikuli的很酷的小项目,如果你能弄明白如何截取屏幕截图,那么它也可能有用:http://sikuli.org/

答案 2 :(得分:0)

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

请检查:http://members.home.nl/wijnenjl/Record_Playback_Python_TclTk_INI_Wx_EN_01.html