0

我在尝试让 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)
4

3 回答 3

3

我不认为你可以单独在 wxPython 中做到这一点。如您所见, wx.Window.WarpPointer()只能将鼠标移动到由该窗口控制的区域。同样,您的wx.EVT_LEFT_DOWN调用将不起作用,因为您将 ID 设置为窗口,这意味着它是被点击的窗口,而不是在 (x,y) 处的点击。

经过一些简单的谷歌搜索后,我发现这篇关于 wxPython中的单元测试的文章简要介绍了 GUI 级别的测试。这并不完全是你想要做的,但它在概念上是相似的。他们建议使用外部库来操作界面。他们注意到这种方法的主要问题是大多数用于模拟 GUI 交互的工具都在公司许可和/或平台相关。

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

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

于 2012-06-12T05:09:43.017 回答
1

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

还有一个很酷的小项目,叫做 sikuli,如果你能弄清楚如何截取屏幕截图,它也可以工作:http: //sikuli.org/

于 2012-06-12T13:34:33.723 回答
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

于 2012-06-20T08:21:13.113 回答