问题 如何用Python控制键盘和鼠标?


如何在Python中控制鼠标和键盘?

我的想法是做同样的事情 Robot()类 在Java中。能够说:将鼠标从这里移动到这里,点击那里,写下屏幕上的任何内容。

对于Windows,有win32api,但我主要使用的是Linux。

对于Linux,有Xlib,但它也适用于键盘? (仅发现鼠标的参考)

是否有跨平台解决方案? (Linux,Windows甚至OS X都会很棒。)


4964
2017-12-22 12:46


起源

Python功能强大,但我认为它不够强大,无法控制键盘和鼠标。如果你能用Python实际让我的鼠标放大我的桌面,我会喜欢它,但我不认为它会发生。 ;-) - Dominic Rodger
仅适用于Windows的良好解决方案 python-forum.org/pythonforum/viewtopic.php?f=2&t=8976 我正在为linux或跨平台寻找相同的东西 - Martin Trigaux
@Dominic它可以做到 - Anurag Uniyal
嗯。可能是您想要模拟用户操作? - vitaly.v.ch
可能重复 哪种是在Python上模拟键盘和鼠标的最简单方法? - kenorb


答案:


我用dogtail(https://fedorahosted.org/dogtail/)做这样的事情,使用这个我已经为我的linux(ubuntu)应用程序创建了一个自动测试fromework。该框架将按钮和类型单击到文本字段中。

看到gedit的例子, https://fedorahosted.org/dogtail/browser/examples/gedit-test-utf8-procedural-api.py

所以就像使用dogtail一样

dogtail.rawinput.click(100, 100)

6
2017-12-22 14:54



很棒,rawinput模块似乎拥有我需要的一切,非常感谢。我读到了真正测试应用程序(检测菜单......)的功能,仅适用于gnome。 rawinput模块是否适用于其他GUI? (无论如何它是开源的,我可以看看) - Martin Trigaux
你知道为什么如果我做dogtail.rawinput.click(x,y)我必须做一个dogtail.rawinput.pressKey('a')否则没有任何反应??? - Martin Trigaux
wierd它可以在没有任何pressKey的情况下在ubuntu上运行 - Anurag Uniyal
我发送了一个错误报告。你可以试试这段代码吗? bugzilla.gnome.org/show_bug.cgi?id=605302 - Martin Trigaux
它适用于Ubuntu 9.10 32bit,而不适用于Debian Sid amd64和Archlinux amd64。 64位版本的错误? - Martin Trigaux


这完全适用于...至少在Mac上。这是用于单击和拖动等。但可以相应地进行改装。

#!/usr/bin/python
import sys
import time
from Quartz.CoreGraphics import * # imports all of the top-level symbols in the module

def mouseEvent(type, posx, posy):
    theEvent = CGEventCreateMouseEvent(None, type, (posx,posy), kCGMouseButtonLeft)
    CGEventPost(kCGHIDEventTap, theEvent)
def mousemove(posx,posy):
    mouseEvent(kCGEventMouseMoved, posx,posy);
def mouseclickdn(posx,posy):
    mouseEvent(kCGEventLeftMouseDown, posx,posy);
def mouseclickup(posx,posy):
    mouseEvent(kCGEventLeftMouseUp, posx,posy);
def mousedrag(posx,posy):
    mouseEvent(kCGEventLeftMouseDragged, posx,posy);

ourEvent = CGEventCreate(None);
currentpos=CGEventGetLocation(ourEvent); # Save current mouse position
mouseclickdn(60, 100);
mousedrag(60, 300);
mouseclickup(60, 300);
time.sleep(1);
mousemove(int(currentpos.x),int(currentpos.y)); # Restore mouse position

2
2017-08-16 02:14





我可以建议你 PyAutoGUI,它允许完全控制鼠标和键盘,并获得截图,甚至你可以在屏幕上找到图像(如:按钮在哪里?),非常有用,动态自动化点击。它适用于Windows,macOS和Linux。

例如:

>>> import pyautogui
>>> screenWidth, screenHeight = pyautogui.size()
>>> pyautogui.moveTo(screenWidth / 2, screenHeight / 2)

看看 介绍页面


2
2017-11-16 08:07





以下是来自Python论坛的一个有趣的线程: Python论坛

编辑: 关于鼠标控制的stackoverflow还有一个令人兴奋的问题......也许这是一个很好的起点.. 使用Python进行鼠标控制

其中一个答案是引用一个Linux示例...它引导您进入一个不错的博客条目。


1
2017-12-22 12:58



好笑,我只是发送相同链接到Dominic Rodger。它只适用于Windows我认为(windll.user32.SetCursorPos听起来不太好) - Martin Trigaux


对于鼠标,我发现了 pymouse 这似乎工作(我没有完全尝试过,点击需要一个小黑客,比较问题)

对于键盘,我不确定Xlib是否可以完成这项工作。我仍然在寻找如何写东西,但你可以按照解释的方式捕捉关键事件 这里 或者在C中 这里 使用Xlib(但我不知道C)。

这里 是一个只在gnome上工作的例子(还不够好)

在pymouse,他们有一个很好的方式使它在3个不同的平台上工作,但需要制作3个代码......


1
2017-12-22 13:26





对于Linux有Xlib,但它也适用于键盘? (仅发现鼠标的参考)

是的,它也适用于键盘。


1
2017-12-23 15:33



很好,我认为Xlib比gtk更通用(参见xlib在维基百科上的页面),但与pygtk相同,我没有看到它的功能...... - Martin Trigaux
用Xlib找到了:鼠标和这里的pymouse(tuxisalive.com/tux-droid-forum/tux-gadgets/245877021)用于键盘 - Martin Trigaux


对于控制台尝试ncurses或俚语。在其他情况下尝试PyQt,PyGtk,TkInter。

所有此解决方案都是跨平台的,几乎可以在任何地方工作。


1
2017-12-22 14:17



我已经找不到适用于Windows和Linux的解决方案已经很难过,所以如果你使用Gtk或Qt,那么一个不同的解决方案似乎并不好。无论如何我不明白你说什么用。哪种方法?怎么样 ?... - Martin Trigaux
为什么Gtk或Qt似乎对你不好?据我所知,TkInter默认嵌入在python中! - vitaly.v.ch
嗯。可能是您想要模拟用户操作? - vitaly.v.ch
是的,这基本上就是我想要做的。我希望能够说从这里到这里,在那里clic并写下屏幕上的内容。我可以用PyQtk,PyGtk或PkInter做到吗? - Martin Trigaux
它必须通过PyGtk提供。关于其他工具包我不确定。 - vitaly.v.ch


linux,windows和mac上的跨平台解决方案是autopy。 https://github.com/msanders/autopy/

它允许控制鼠标和键盘,截取屏幕截图,并在较大的位图上查找小位图,如果你想自动化一些你无法控制的gui应用程序,它应该非常方便。


0
2018-05-05 20:53