PyAuto GUI自动化

1. 鼠标控制功能

屏幕和鼠标位置

屏幕上的位置由 X 和 Y 笛卡尔坐标表示。X 坐标从左边的0开始,然后向右增加。与数学不同的是,Y 坐标从上面的0开始,然后向下增加。
请添加图片描述
左上角的像素位于坐标0,0。如果屏幕的分辨率是1920 x 1080,那么右下角的像素就是1919,1079(因为坐标是从0开始的,而不是1)。
Size ()函数将屏幕分辨率大小作为两个整数的元组返回。Position ()函数返回鼠标光标的当前 X 和 Y 坐标。
例如:

>>> pyautogui.size()
(1920, 1080)
>>> pyautogui.position()
(187, 567)

下面是一个简短的 Python 3程序,它可以不断地打印出鼠标光标的位置:

#! python3
import pyautogui, sys
print('Press Ctrl-C to quit.')
try:
    while True:
        x, y = pyautogui.position()
        positionStr = 'X: ' + str(x).rjust(4) + ' Y: ' + str(y).rjust(4)
        print(positionStr, end='')
        print('\b' * len(positionStr), end='', flush=True)
except KeyboardInterrupt:
    print('\n')

下面是 Python 2的版本:

#! python
import pyautogui, sys
print('Press Ctrl-C to quit.')
try:
    while True:
        x, y = pyautogui.position()
        positionStr = 'X: ' + str(x).rjust(4) + ' Y: ' + str(y).rjust(4)
        print positionStr,
        print '\b' * (len(positionStr) + 2),
        sys.stdout.flush()
except KeyboardInterrupt:
    print '\n'

要检查屏幕上是否有 XY 坐标,请将它们(作为两个整数参数或单个 tuple/list 参数和两个整数)传递给 onScreen ()函数,如果它们在屏幕的边界内,该函数将返回 True,如果不在,则返回 False。
例如:

>>> pyautogui.onScreen(0, 0)
True
>>> pyautogui.onScreen(0, -1)
False
>>> pyautogui.onScreen(0, 99999999)
False
>>> pyautogui.size()
(1920, 1080)
>>> pyautogui.onScreen(1920, 1080)
False
>>> pyautogui.onScreen(1919, 1079)
True

鼠标移动

MoveTo ()函数将鼠标光标移动到传递给它的 X 和 Y 整数坐标。可以为坐标传递“无”值,以表示“当前鼠标光标位置”。例如:

>>> pyautogui.moveTo(100, 200)   #移动鼠标到X的100,Y的200。
>>> pyautogui.moveTo(None, 500)  # 移动鼠标到X的100,Y的500。
>>> pyautogui.moveTo(600, None)  # 移动鼠标到X的600,Y的500。

通常,鼠标光标会立即移动到新的坐标。如果希望鼠标逐渐移动到新位置,请传递第三个参数,该参数的持续时间为(以秒为单位)。例如:

>>> pyautogui.moveTo(100, 200, 2)   # 2秒内移动鼠标到X (100) Y (200)

(如果持续时间小于 pyautogui.MINIMUM _ DURATION,则移动将是即时的,默认情况下,pyautogui.MINIMUM _ DURATION 为0.1。)

如果希望将鼠标光标相对于其当前位置移动几个像素,请使用 move ()函数。此函数具有与 moveTo ()类似的参数。例如:

>>> pyautogui.moveTo(100, 200)  #移动鼠标到X的100,Y的200。
>>> pyautogui.move(0, 50)       # 将鼠标向下移动50像素。
>>> pyautogui.move(-30, 0)      # 将鼠标向左移动30像素。
>>> pyautogui.move(-30, None)   # 将鼠标向左移动30像素。

鼠标拖动

PyAutoGUI 的 dragTo ()和 drag ()函数具有与 moveTo ()和 move ()函数相似的参数。此外,他们有一个按钮关键字,可以设置为‘左’,‘中’,’右’鼠标按钮按住拖动。例如:

>>> pyautogui.dragTo(100, 200, button='left')     # 拖动鼠标X到100,Y到200,同时按住鼠标左键
>>> pyautogui.dragTo(300, 400, 2, button='left')  # 按住鼠标左键,在2秒内将鼠标拖动到X的300处,Y的400处
>>> pyautogui.drag(30, 0, 2, button='right')   # 按住鼠标右键,在2秒内将鼠标向左拖动30像素

个性化控制鼠标拖动速度

个性化控拖动是一个额外的功能,使鼠标的运动想象。如果您不关心这一部分,可以跳过这一部分。

在鼠标移动到目的地时,Teen 或 easy 函数指示鼠标的进度。通常,当鼠标在一段时间内移动时,鼠标以恒定的速度沿直线直接向目标移动。

PyAutoGUI 在 PyAutoGUI 模块中还有其他可用的 Tweing 函数。可以将 pyautogui.easeInQuad 函数作为第4个参数传递给 moveTo ()、 move ()、 dragTo ()和 drag ()函数,以使鼠标光标开始缓慢移动,然后加速到目标。总持续时间仍然与传递给函数的参数相同。Pyautogui.easeOutQuad 则相反: 鼠标光标开始快速移动,但在接近目标时速度减慢。

Pyautogui.easeOutElastic 会来回超过目的地和“橡皮筋”,直到到达目的地。
例如:

>>> pyautogui.moveTo(100, 100, 2, pyautogui.easeInQuad)     # 慢慢开始,快速结束
>>> pyautogui.moveTo(100, 100, 2, pyautogui.easeOutQuad)    # 开始快,结束慢
>>> pyautogui.moveTo(100, 100, 2, pyautogui.easeInOutQuad)  # 开始和结束快,中间慢
>>> pyautogui.moveTo(100, 100, 2, pyautogui.easeInBounce)   # 最后跳起来
>>> pyautogui.moveTo(100, 100, 2, pyautogui.easeInElastic)  # 最后绑上橡皮筋

这些 tween 函数是从 Al Sweigart 的 Pytween 模块复制过来的: https://pypi.python.org/pypi/PyTweening https://github.com/asweigart/PyTweening 这个模块不需要安装就可以使用 tween 函数。
如果您想要创建自己的 tween 函数,那么定义一个函数,该函数接受一个介于0.0(表示鼠标移动的开始)和1.0(表示鼠标移动的结束)之间的浮点参数,并返回一个介于0.0和1.0之间的浮点值。

鼠标点击

Click ()函数模拟在鼠标当前位置单击左键鼠标。“点击”被定义为按下按钮,然后释放它。例如:

>>> pyautogui.click()  # 点击鼠标

要在单击之前组合 moveTo ()调用,请为 x 和 y 关键字参数传递整数:

>>> pyautogui.click(x=100, y=200)  # 移动到100,200,然后单击鼠标左键

若要指定要单击的不同鼠标按钮,请为按钮关键字参数传递“左”、“中”或“右”:

>>> pyautogui.click(button='right')  # 鼠标右键双击

若要执行多次单击,请将一个整数传递给单击关键字参数。可选地,您可以传递浮点数或整数到间隔关键字参数,以指定单击之间以秒为单位的暂停次数。例如:

>>> pyautogui.click(clicks=2)  # 双击鼠标左键
>>> pyautogui.click(clicks=2, interval=0.25)  # 双击鼠标左键,但在单击之间有四分之一秒的暂停
>>> pyautogui.click(button='right', clicks=3, interval=0.25)  ## 三次点击鼠标右键,在点击之间有0.25秒的停顿

作为一个方便的快捷方式,doubleClick ()函数将双击鼠标左键。它还具有可选的 x、 y、间隔和按钮关键字参数。例如:

>>> pyautogui.doubleClick()  #执行左键双击

还有一个带有类似可选关键字参数的 tripleClick ()函数。
Right Click ()函数具有可选的 x 和 y 关键字参数。

MouseDown ()和 mouseUp ()函数

鼠标点击和拖动是由按下鼠标按钮和释放它回来。如果希望分别执行这些操作,请调用 mouseDown ()和 mouseUp ()函数。它们有相同的 x,y 和按钮。例如:

>>> pyautogui.mouseDown(); pyautogui.mouseUp()  # 是否与鼠标左键点击相同
>>> pyautogui.mouseDown(button='right')  # 按下右边的按钮
>>> pyautogui.mouseUp(button='right', x=100, y=200)  #将鼠标移动到100,200,然后释放右键向上

鼠标滚动

鼠标滚轮可以通过调用 roll ()函数并传递一个整数的“点击次数”来模拟滚动。在不同的平台上,“单击”的滚动量是不同的。可选地,可以为 x 和 y 关键字参数传递整数,以便在执行滚动之前移动鼠标光标。例如:

>>> pyautogui.scroll(10)   # 向上滚动10“点击”
>>> pyautogui.scroll(-10)  # 向下滚动10个“点击”
>>> pyautogui.scroll(10, x=100, y=100)  #移动鼠标光标到100,200,然后向上滚动10 "点击"

OS XLinux 平台上,PyAutoGUI 还可以通过调用 hroll ()函数来执行水平滚动:

>>> pyautogui.hscroll(10)   #向右滚动10次点击
>>> pyautogui.hscroll(-10)   #向左滚动10 "点击"

scroll()函数是 vscroll()的包装器,它执行垂直滚动。

2.键盘控制功能

Write ()函数

主键盘函数是 write ()。此函数将在传递的字符串中键入字符。若要在按下每个字符键之间添加延迟间隔,请为间隔关键字参数传递 interval
例如:

>>> pyautogui.write('Hello world!')    # 立即打印出“你好,世界!
>>> pyautogui.write('Hello world!', interval=0.25)  # 打印出“Hello world!”,每个字符后面有0.25秒的延迟

Press ()、 keyDown ()和 keyUp ()函数

要按下这些键,调用 press ()函数并从 pyautogui.KEYBOARD _ KEYS 中传递一个字符串给它,例如 enter、 esc、 f1。参见键盘键盘。
例如:

>>> pyautogui.press('enter')  # press the Enter key
>>> pyautogui.press('f1')     # press the F1 key
>>> pyautogui.press('left')   # press the left arrow key

Press ()函数实际上只是 keyDown ()和 keyUp ()函数的包装器,它们模拟按下一个键然后释放它。这些函数可以自己调用。例如,要在按住 Shift 键的同时按左箭头键三次,请调用以下命令:

>>> pyautogui.keyDown('shift')  # 按下shift键
>>> pyautogui.press('left')     # 按左箭头键
>>> pyautogui.press('left')     # 按左箭头键
>>> pyautogui.press('left')     # 按左箭头键
>>> pyautogui.keyUp('shift')    # 松开shift键

要按下与 write ()类似的多个键,需要传递一个字符串列表给 press ()。例如:

>>> pyautogui.press(['left', 'left', 'left'])

或者你可以设置按下次数:

>>> pyautogui.press('left', presses=3)

若要在每次按压之间添加延迟间隔,请为间隔关键字参数传递 interval 。

Hold ()上下文管理器

为了方便保存键,hold ()函数可以用作上下文管理器,并从 pyautogui.KEYBOARD _ KEYS 中传递一个字符串,比如 shift、 ctrl、 alt,这个键将在 with 上下文块期间保存。参见键盘键盘。

>>> with pyautogui.hold('shift'):
        pyautogui.press(['left', 'left', 'left'])

相当于这个代码

>>> pyautogui.keyDown('shift')  # 按住shift键
>>> pyautogui.press('left')     # 按左箭头键
>>> pyautogui.press('left')     # 按左箭头键
>>> pyautogui.press('left')     # 按左箭头键
>>> pyautogui.keyUp('shift')    # 松开shift键

hotkey() 函数

为了方便按热键或键盘快捷键,热键()可以传递多个按顺序按下的按键字符串,然后按相反的顺序释放。这个代码:

>>> pyautogui.hotkey('ctrl', 'shift', 'esc')

相当于这个代码

>>> pyautogui.keyDown('ctrl')
>>> pyautogui.keyDown('shift')
>>> pyautogui.keyDown('esc')
>>> pyautogui.keyUp('esc')
>>> pyautogui.keyUp('shift')
>>> pyautogui.keyUp('ctrl')

若要在每次按压之间添加延迟间隔,请为间隔关键字参数传递interval

键盘内容范围

以下是传递给 press ()、 keyDown ()、 keyUp ()和 hotkey ()函数的有效字符串:

['\t', '\n', '\r', ' ', '!', '"', '#', '$', '%', '&', "'", '(',
')', '*', '+', ',', '-', '.', '/', '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']

3.消息框功能

PyAutoGUI 利用 PyMsgBox 中的消息框函数提供一种跨平台的纯 Python 方式来显示 JavaScript 风格的消息框。提供了四个消息框功能:

alert() 函数

>>> alert(text='', title='', button='OK')

显示一个包含文本,标题和单个“确定”按钮的简单消息框。返回单击的按钮的文本。

confirm()函数

>>> confirm(text='', title='', buttons=['OK', 'Cancel'])

显示带有“确定”和“取消”按钮的消息框。可以自定义按钮的数量和文本。返回单击的按钮的文本。

prompt() 函数

>>> prompt(text='', title='' , default='')

显示带有文本输入的消息框以及“确定”和“取消”按钮。返回输入的文本,如果单击“取消”则返回“无”。

Password ()函数

>>> password(text='', title='', default='', mask='*')

显示带有文本输入的消息框以及“确定”和“取消”按钮。键入的字符显示为 * 。返回输入的文本,如果单击“取消”则返回“无”。

4.截图功能

PyAutoGUI 可以截屏,将它们保存到文件中,并在屏幕中定位图像。这是有用的,如果你有一个小图像,例如,一个按钮,需要被点击,并希望在屏幕上找到它。这些特性由 PyScreeze 模块提供,该模块是与 PyAutoGUI 一起安装的。

屏幕截图功能需要Pillow模块。OS X 使用屏幕捕获命令,这是操作系统自带的。Linux 使用 scrot 命令,可以通过运行 sudo apt-get install scrot 来安装这个命令。

screenshot() 截图函数

调用 screen shot ()将返回一个 Image 对象(有关详细信息,请参阅Pillow或 PIL 模块文档)。传递一个文件名字符串将把屏幕截图保存到一个文件中,并将其作为 Image 对象返回。

>>> import pyautogui
>>> im1 = pyautogui.screenshot()
>>> im2 = pyautogui.screenshot('my_screenshot.png')

在一个1920 x 1080的屏幕上,screenshot()截图功能大约需要100毫秒——它不快,但也不慢。

如果您不想要整个屏幕的截图,还有一个可选的 region 关键字参数。您可以传递区域的左边、顶部、宽度和高度的四个整数元组来捕获:

>>> import pyautogui
>>> im = pyautogui.screenshot(region=(0,0, 300, 400))

5.图像定位

注意: 从版本0.9.41开始,如果 location 函数找不到提供的映像,它们将引发 ImageNotFoundException 而不是返回 Nothing。
如果你有一个图像文件,你可以在屏幕上直观地找到一些东西。例如,假设计算器应用程序在你的电脑上运行,看起来是这样的:

在这里插入图片描述

如果不知道计算器按钮的确切屏幕坐标,就不能调用 moveTo ()和 click ()函数。每次启动计算器时,它可能会出现在稍微不同的位置,导致您每次都要重新找到坐标。但是,如果你有一个按钮的图像,比如7号按钮的图像:
在这里插入图片描述

… 您可以调用 locateOnScreen (‘ calc7key.png’)函数来获取屏幕坐标。返回值是一个4-integer tuple: (左、上、宽、高)。这个元组可以传递给 center () ,以获得该区域中心的 X 和 Y 坐标。如果在屏幕上找不到图像,locateOnScreen ()会引发 ImageNotFoundException。

>>> import pyautogui
>>> button7location = pyautogui.locateOnScreen('calc7key.png')
>>> button7location
Box(left=1416, top=562, width=50, height=41) #left,top图片的坐标x,y该位置并非图片中心位置而是左上角;width,height图片的长,宽
>>> button7location[0]
1416
>>> button7location.left
1416
>>> button7point = pyautogui.center(button7location)
>>> button7point   
Point(x=1441, y=582)  #获取图片位置中心坐标
>>> button7point[0]
1441
>>> button7point.x
1441
>>> button7x, button7y = button7point #返回图片中心坐标x,y
>>> pyautogui.click(button7x, button7y)  #单击7按钮所在位置的中心
>>> pyautogui.click('calc7key.png') #一个快捷的版本,点击中心的7按钮被发现

可选confidence关键字参数指定函数在屏幕上定位图像的准确性。如果由于像素差异可以忽略不计,函数无法定位图像,这是有帮助的:

>>> import pyautogui
>>> button7location = pyautogui.locateOnScreen('calc7key.png', confidence=0.9)
>>> button7location
Box(left=1416, top=562, width=50, height=41)

注意: 您需要安装 OpenCV 才能使confidence关键字起作用。

LocateCenterOnScreen ()函数将 locateOnScreen ()和 center ()组合在一起:

>>> import pyautogui
>>> x, y = pyautogui.locateCenterOnScreen('calc7key.png')
>>> pyautogui.click(x, y)

在1920x1080屏幕上,定位函数调用大约需要1到2秒。这对于动作视频游戏来说可能太慢了,但是对于大多数目的和应用程序来说是可行的。

有几个“定位”函数。他们都开始看屏幕(或图像)的左上角,然后向右看然后向下看。参数可以是

● locateOnScreen(image, grayscale=False) - 返回屏幕上第一个找到的image实例的坐标(left, top, width, height). 如果没有在屏幕上找到,抛出ImageNotFoundException异常。

● locateCenterOnScreen(image, grayscale=False) - 返回屏幕上第一个找到的图像实例的中心坐标(x, y). 如果没有在屏幕上找到,抛出ImageNotFoundException异常。

● locateAllOnScreen(image, grayscale=False) - 返回一个生成器,生成图像在屏幕上的位置(left, top, width, height)元组

● locate(needleImage, haystackImage, grayscale=False) - 返回hayystackimage中第一个找到的needleImage实例的坐标(左,上,宽,高). 如果没有在屏幕上找到,抛出ImageNotFoundException异常。

● locateAll(needleImage, haystackImage, grayscale=False) - 返回一个生成器,该生成器生成haystackImage中找到needleImage的位置的元组(left, top, width, height)。

可以在 for 循环中使用“ location all”函数,也可以将其传递给 list () :

>>> import pyautogui
>>> for pos in pyautogui.locateAllOnScreen('someButton.png')
...   print(pos)
...
(1101, 252, 50, 50)
(59, 481, 50, 50)
(1395, 640, 50, 50)
(1838, 676, 50, 50)
>>> list(pyautogui.locateAllOnScreen('someButton.png'))
[(1101, 252, 50, 50), (59, 481, 50, 50), (1395, 640, 50, 50), (1838, 676, 50, 50)]

这些“定位”函数相当慢; 它们可能需要整整一秒钟才能运行。加速它们的最佳方法是传递一个区域参数(一个4整数的元组(左、上、宽、高)) ,只搜索屏幕的一个较小的区域,而不是全屏:

>>> import pyautogui
>>> pyautogui.locateOnScreen('someButton.png', region=(0,0, 300, 400))

Grayscale匹配

可以选择将 grayscale = True 传递给定位函数,以稍微提高速度(大约30% 左右)。这会降低图像和截图的色彩饱和度,加快定位速度,但可能导致匹配不精准。

>>> import pyautogui
>>> button7location = pyautogui.locateOnScreen('calc7key.png', grayscale=True)
>>> button7location
(1416, 562, 50, 41)

Pixel匹配

要获得屏幕快照中像素的 RGB 颜色,请使用 Image 对象的 get敢像素()方法:

>>> import pyautogui
>>> im = pyautogui.screenshot()
>>> im.getpixel((100, 200))
(130, 135, 144)

或者作为一个单独的函数,调用Pixel() PyAutoGUI 函数,它是前面调用的包装器:

>>> import pyautogui
>>> pix = pyautogui.pixel(100, 200)
>>> pix
RGB(red=130, green=135, blue=144)
>>> pix[0]
130
>>> pix.red
130

如果您只是需要验证一个像素是否匹配给定的像素,那么调用 pixelMatchesColor ()函数,将它所代表的颜色的 X 坐标、 Y 坐标和 RGB 元组传递给它:

>>> import pyautogui
>>> pyautogui.pixelMatchesColor(100, 200, (130, 135, 144))
True
>>> pyautogui.pixelMatchesColor(100, 200, (0, 0, 0))
False

可选tolerance 关键字参数指定在仍然匹配的情况下,红色、绿色和蓝色值的变化程度:

>>> import pyautogui
>>> pyautogui.pixelMatchesColor(100, 200, (130, 135, 144))
True
>>> pyautogui.pixelMatchesColor(100, 200, (140, 125, 134))
False
>>> pyautogui.pixelMatchesColor(100, 200, (140, 125, 134), tolerance=10)
True
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值