【问题标题】:How can I control the keyboard and mouse with Python?如何使用 Python 控制键盘和鼠标?
【发布时间】:2010-12-29 02:32:11
【问题描述】:

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

这个想法与 Java 中的 Robot() class 相同。可以说:将鼠标从这里移到这里,点击那里,写下屏幕上的任何内容。

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

对于 Linux,有 Xlib,但它也适用于键盘吗? (发现只引用了鼠标)

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

【问题讨论】:

标签: python linux awtrobot


【解决方案1】:

我使用 dogtail (https://fedorahosted.org/dogtail/) 来做这些事情,使用它我为我的 Linux(Ubuntu) 应用程序创建了一个自动化测试框架。该框架单击按钮并在文本字段中键入内容。

查看 gedit 示例,https://fedorahosted.org/dogtail/browser/examples/gedit-test-utf8-procedural-api.py

所以只需使用 dogtail 例如

dogtail.rawinput.click(100, 100)

【讨论】:

  • 太好了,rawinput 模块似乎拥有我需要的一切,非常感谢。我阅读了该功能以真正测试应用程序(检测菜单,...)仅适用于 gnome。 rawinput 模块是否适用于其他 GUI? (反正是开源的,我可以看看)
  • 你知道为什么如果我做一个 dogtail.rawinput.click(x, y) 我必须做一个 dogtail.rawinput.pressKey('a') 否则什么都不会发生???
  • 我已发送错误报告。你能试试这段代码吗? bugzilla.gnome.org/show_bug.cgi?id=605302
  • 它适用于 Ubuntu 9.10 32 位,不适用于 Debian Sid amd64 和 Archlinux amd64。来自 64 位版本的错误?
  • windows 有什么类似的吗?
【解决方案2】:

我可以建议您PyAutoGUI,它允许完全控制鼠标和键盘并获取屏幕截图,甚至您可以在屏幕内定位图像(例如:按钮在哪里?),对于动态自动点击非常有用。它适用于 Windows、macOS 和 Linux。

例如:

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

查看Introduction page。

【讨论】:

    【解决方案3】:

    这完全有效……至少在 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
    

    【讨论】:

      【解决方案4】:

      这里有一个来自 Python 论坛的有趣主题: Python Forum

      编辑: 在stackoverflow上还有一个关于鼠标控制的有趣问题......也许这是一个很好的起点...... Mouse Control with Python

      其中一个答案是参考一个 Linux 示例...它会引导您访问一个不错的博客条目。

      【讨论】:

      • 有趣的是,我只是将相同的链接发送给 Dominic Rodger。我认为它只能在 Windows 上运行(windll.user32.SetCursorPos 听起来不太好)
      【解决方案5】:

      对于鼠标,我发现 pymouse 似乎可以工作(我还没有完全尝试过,点击需要一个小技巧,参见问题)

      对于键盘,我不确定 Xlib 能否胜任这项工作。我仍在研究如何编写一些东西,但您可以按照 here 或 C here 的说明使用 Xlib 捕获关键事件(但我不知道 C)。

      here 是仅在 gnome 上工作的示例(还不够好)

      在 pymouse 中,他们有一个很好的方法可以让它在 3 个不同的平台上工作,但需要编写 3 个代码......

      【讨论】:

        【解决方案6】:

        对于 linux,有 Xlib,但它也适用于键盘吗? (发现只提到鼠标)

        是的,它也适用于键盘。

        【讨论】:

        • 太棒了,我认为 Xlib 比 gtk 更通用(参见维基百科上的 xlib 页面),但与 pygtk 相同,我看不到它的功能......
        • ok 用 Xlib 找到:pymouse 用于鼠标,此处 (tuxisalive.com/tux-droid-forum/tux-gadgets/245877021) 用于键盘
        【解决方案7】:

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

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

        【讨论】:

        • 很遗憾,我找不到适用于 windows 和 linux 的解决方案,因此如果您使用 Gtk 或 Qt,则另一种解决方案似乎不太好。无论如何我不明白你说要使用什么。哪种方法?怎么样?...
        • 为什么 Gtk 或 Qt 对你来说似乎不好?据我所知,TkInter 默认嵌入在 python 中!!!
        • 嗯。可能是您想要模拟用户操作?
        • 是的,这基本上就是我想要做的。我想说从这里到这里,点击那里并写下屏幕上的任何内容。我可以用 PyQtk、PyGtk 或 PkInter 来做吗?
        • 它必须可以通过 PyGtk 获得。关于其他工具包我不确定。
        【解决方案8】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-06-26
          • 2021-11-11
          • 1970-01-01
          • 1970-01-01
          • 2010-09-15
          • 2012-05-09
          • 1970-01-01
          相关资源
          最近更新 更多