Python PyAutoGUI入门

Getting Started with Python PyAutoGUI

介绍

在本教程中,我们将学习如何在Python 3中使用pyautogui库。PyAutoGUI库提供了跨平台支持,可通过代码来管理鼠标和键盘操作以实现任务自动化。 PyAutoGUI库也可用于Python 2。 但是,在本教程的整个过程中,我们将使用Python 3。

这样的工具具有许多应用程序,其中一些应用程序包括截屏,自动化GUI测试(如Selenium),自动化只能用GUI完成的任务等。

在继续本教程之前,请注意,有一些先决条件。 您应该对Python的语法有基本的了解,并且/或者至少已经用其他某种语言完成了初学者级的编程。 除此之外,本教程对于初学者而言非常简单且易于遵循。

安装

对于所有操作系统,PyAutoGUI的安装过程都非常简单。 但是,在PyAutoGUI库可以在程序中安装和使用之前,需要安装一些Mac和Linux依赖项。

视窗

对于Windows,PyAutoGUI没有依赖性。 只需在命令提示符下运行以下命令,即可完成安装。

1
$ pip install PyAutoGUI

苹果电脑

对于Mac,需要先按顺序安装pyobjc-corepyobjc模块。 以下是在终端中按顺序运行以成功安装所需的命令:

1
2
3
$ pip3 install pyobjc-core
$ pip3 install pyobjc
$ pip3 install pyautogui

的Linux

对于Linux,唯一的依赖项是python3-xlib(对于Python 3)。 要安装它,然后在pyautogui后面,在终端中运行下面提到的两个命令:

1
2
$ pip3 install python3-xlib
$ pip3 install pyautogui

基本代码示例

在本节中,我们将介绍PyAutoGUI库中一些最常用的函数。

通用功能

position()函数

在使用PyAutoGUI函数之前,我们需要将其导入到程序中:

1
import pyautogui as pag

position()函数告诉我们鼠标在屏幕上的当前位置:

1
pag.position()

输出:

1
Point (x = 643, y = 329)

onScreen()函数

onScreen()函数告诉我们在屏幕上是否存在坐标为x和y的点:

1
2
print(pag.onScreen(500, 600))
print(pag.onScreen(0, 10000))

输出:

1
2
True
False

在这里我们可以看到屏幕上存在第一个点,但是第二个点超出了屏幕的尺寸。

size()函数

size()函数查找屏幕的高度和宽度(分辨率)。

1
pag.size()

输出:

1
Size (width = 1440, height = 900)

您的输出可能会有所不同,并且将取决于屏幕的大小。

常用鼠标操作

在本节中,我们将介绍用于鼠标操作的PyAutoGUI函数,包括移动光标的位置以及通过代码自动单击按钮。

moveTo()函数

moveTo()函数的语法如下:

1
pag.moveTo(x_coordinate, y_coordinate)

x_coordinate的值在屏幕上从左到右增加,而y_coordinate的值从上到下增加。 屏幕左上角的x_coordinatey_coordinate的值均为0。

看下面的脚本:

1
2
3
4
5
pag.moveTo(0, 0)
pag.PAUSE = 2
pag.moveTo(100, 500) #
pag.PAUSE = 2
pag.moveTo(500, 500)

在上面的代码中,主要焦点是moveTo()函数,该函数根据我们作为参数提供的坐标在屏幕上移动鼠标光标。 第一个参数是x坐标,第二个参数是y坐标。 重要的是要注意,这些坐标表示光标的绝对位置。

上面的代码中引入的另一件事是PAUSE属性。 它基本上会在给定的时间内暂停脚本的执行。 上面的代码中添加了PAUSE属性,以便您可以看到函数的执行; 否则,函数将在一瞬间执行,您将无法在屏幕上实际看到光标从一个位置移动到另一个位置。

另一个解决方法是将每个moveTo()操作的时间指示为函数中的第三个参数,例如 moveTo(x, y, time_in_seconds)

执行上述脚本可能会导致以下错误:

注意:可能的错误

1
2
3
4
5
6
7
8
Traceback (most recent call last):
  File"a.py", line 5, in <module>
    pag.moveTo (100, 500)
  File"/anaconda3/lib/python3.6/site-packages/pyautogui/__init__.py", line 811, in moveTo
    _failSafeCheck()
  File"/anaconda3/lib/python3.6/site-packages/pyautogui/__init__.py", line 1241, in _failSafeCheck
    raise FailSafeException ('PyAutoGUI fail-safe triggered from mouse moving to a corner of the screen. To disable this fail-safe, set pyautogui.FAILSAFE to False. DISABLING FAIL-SAFE IS NOT RECOMMENDED.')
pyautogui.FailSafeException: PyAutoGUI fail-safe triggered from mouse moving to a corner of the screen. To disable this fail-safe, set pyautogui.FAILSAFE to False. DISABLING FAIL-SAFE IS NOT RECOMMENDED.

如果moveTo()函数的执行产生与以上所示类似的错误,则表明您的计算机的故障保护已启用。 要禁用故障保险,请在代码开头添加以下行:

1
pag.FAILSAFE = False

默认情况下启用此功能,以便您可以通过手动将鼠标移至屏幕的左上角来轻松停止执行pyautogui程序。 一旦鼠标位于此位置,pyautogui将引发异常并退出。

moveRel()函数

moveTo()函数的坐标是绝对的。 但是,如果要相对于当前鼠标位置移动鼠标位置,则可以使用moveRel()函数。

这意味着,当移动光标时,此功能的参考点将不是屏幕上的左上点(0,0),而是鼠标光标的当前位置。 因此,如果鼠标光标当前位于屏幕上的点(100,100),并且您使用参数(100, 100, 2)调用moveRel()函数,则移动光标的新位置将为(200,200)。

您可以使用moveRel()函数,如下所示:

1
pag.moveRel(100, 100, 2)

相对于当前光标位置,上述脚本将在2秒内将光标向右移动100点,向下移动100点。

click()函数

click()函数用于模仿鼠标单击操作。 click()函数的语法如下:

1
pag.click(x, y, clicks, interval, button)

参数说明如下:

  • x:要到达的点的x坐标

  • y:要到达的点的y坐标

  • clicks:当光标到达屏幕上的该点时您想要执行的点击次数

  • interval:两次鼠标单击之间的时间间隔(以秒为单位),即,如果您多次单击鼠标

  • button:指定当光标到达屏幕上的该点时要在鼠标上按下的按钮。 可能的值为rightleftmiddle

  • 这是一个例子:

    1
    pag.click(100, 100, 5, 2, 'right')

    您还可以执行以下特定的单击功能:

    1
    2
    3
    4
    pag.rightClick(x, y)
    pag.doubleClick(x, y)
    pag.tripleClick(x, y)
    pag.middleClick(x, y)

    与以前的函数一样,此处的xy表示xy坐标。

    您还可以通过指定何时按下鼠标以及何时释放鼠标来对鼠标单击进行更细粒度的控制。 分别使用mouseDownmouseUp函数完成此操作。

    这是一个简短的示例:

    1
    2
    pag.mouseDown(x=x, y=y, button='left')
    pag.mouseUp(x=x, y=y, button='left')

    上面的代码等效于仅执行pag.click(x, y)调用。

    scroll()函数

    我们要介绍的最后一个鼠标功能是scroll。 如预期的那样,它具有两个选项:向上滚动和向下滚动。 scroll()函数的语法如下:

    1
    pag.scroll(amount_to_scroll, x=x_movement, y=y_movement)

    要向上滚动,请为amount_to_scroll参数指定一个正值,向下滚动,请指定一个负值。 这是一个例子:

    1
    pag.scroll(100, 120, 120)

    好了,这就是鼠标功能。 现在,您应该已经能够控制鼠标的按钮以及通过代码进行的移动了。 现在让我们转到键盘功能。 有很多,但我们将只介绍最常用的那些。

    常用键盘操作

    在转到功能之前,重要的是要知道可以通过pyautogui中的代码按下哪些键,以及它们的确切命名约定。 为此,请运行以下脚本:

    1
    print(pag.KEYBOARD_KEYS)

    输出:

    1
    2
    3
    ['\t', '
    '
    , '
    '
    , ' ', '!', '"', '#', '$', '%', '&',"'", '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', '[', '\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', 'accept', 'add', 'alt', 'altleft', 'altright', 'apps', 'backspace', 'browserback', 'browserfavorites', 'browserforward', 'browserhome', 'browserrefresh', 'browsersearch', 'browserstop', 'capslock', 'clear', 'convert', 'ctrl', 'ctrlleft', 'ctrlright', 'decimal', 'del', 'delete', 'divide', 'down', 'end', 'enter', 'esc', 'escape', 'execute', 'f1', 'f10', 'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f2', 'f20', 'f21', 'f22', 'f23', 'f24', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'final', 'fn', 'hanguel', 'hangul', 'hanja', 'help', 'home', 'insert', 'junja', 'kana', 'kanji', 'launchapp1', 'launchapp2', 'launchmail', 'launchmediaselect', 'left', 'modechange', 'multiply', 'nexttrack', 'nonconvert', 'num0', 'num1', 'num2', 'num3', 'num4', 'num5', 'num6', 'num7', 'num8', 'num9', 'numlock', 'pagedown', 'pageup', 'pause', 'pgdn', 'pgup', 'playpause', 'prevtrack', 'print', 'printscreen', 'prntscrn', 'prtsc', 'prtscr', 'return', 'right', 'scrolllock', 'select', 'separator', 'shift', 'shiftleft', 'shiftright', 'sleep', 'space', 'stop', 'subtract', 'tab', 'up', 'volumedown', 'volumemute', 'volumeup', 'win', 'winleft', 'winright', 'yen', 'command', 'option', 'optionleft', 'optionright']

    typewrite()函数

    typewrite()函数用于在文本字段中键入内容。 该函数的语法如下:

    1
    pag.typewrite(text, interval)

    text是您要在字段中键入的内容,interval是每个按键之间的时间(以秒为单位)。 这是一个例子:

    1
    pag.typewrite('Junaid Khalid', 1)

    执行上面的脚本将在当前选择的字段中输入文本" Junaid Khalid",每次按键之间的间隔为1秒。

    可以使用此功能的另一种方法是传递要按顺序按下的键列表。 为此,请参见下面的示例:

    1
    pag.typewrite(['j', 'u', 'n', 'a', 'i', 'd', 'e', 'backspace', 'enter'])

    在上面的示例中,将输入文本junaide,然后删除尾随的e。 文本字段中的输入将通过按Enter键提交。

    hotkey()函数

    如果到目前为止您还没有注意到这一点,那么上面显示的键对于复制命令如Control + C的组合操作都没有提及。 如果您认为可以通过将列表['ctrl', 'c']传递给typewrite()函数来做到这一点,那是错误的。 typewrite()功能将按顺序而不是同时按两个按钮。 如您可能已经知道的那样,要执行复制命令,需要在按住ctrl键的同时按C键。

    要同时按下两个或多个键,可以使用hotkey()功能,如下所示:

    1
    2
    3
    pag.hotkey('shift', 'enter')
    pag.hotkey('ctrl', '2' ) # For the @ symbol
    pag.hotkey('ctrl', 'c')  # For the copy command

    screenshot()函数

    如果您想在任何情况下截取屏幕截图,都可以使用screenshot()函数。 让我们看看如何使用PyAutoGUI来实现它:

    1
    scree_shot = pag.screenshot() # to store a PIL object containing the image in a variable

    这会将包含图像的PIL对象存储在变量中。

    但是,如果要将屏幕截图直接存储到计算机,则可以这样调用screenshot函数:

    1
    pag.screenshot('ss.png')

    这会将屏幕快照保存在计算机上的文件中,并给出文件名。

    Confirm(),alert()和prompt()函数

    我们将在本教程中介绍的最后一组功能是消息框功能。 这是PyAutoGUI中可用的消息框功能的列表:

  • 确认框:显示信息并提供两个选项,即OKCancel

  • 警报框:显示一些信息并确认已阅读。 它显示一个按钮,即OK

  • 提示框:向用户请求一些信息,输入后,用户必须单击OK按钮

  • 现在我们已经了解了类型,让我们看看如何以与上述相同的顺序在屏幕上显示这些按钮:

    1
    2
    3
    pag.confirm("Are you ready?")
    pag.alert("The program has crashed!")
    pag.prompt("Please enter your name:")

    在输出中,您将看到以下消息框序列。

    确认:

    >
</p>
<p>
警报:
</p>
<p>
<img src=