PyAutoGUI使用入门

PyAutoGUI 是一个 Python 模块,用于在图形用户界面 (GUI) 自动化中生成鼠标和键盘输入。它可以用于自动化任务、测试、模拟用户输入等。

安装 PyAutoGUI

你可以使用 pip 安装 PyAutoGUI:

pip install pyautogui

使用

import pyautogui    # 导入模块

获取屏幕大小

screenWidth, screenHeight = pyautogui.size()
screenWidth, screenHeight
(2560, 1600)

鼠标功能

获取鼠标位置

currentMouseX, currentMouseY = pyautogui.position() # 获取当前鼠标位置
print(currentMouseX, currentMouseY)

移动鼠标到指定位置

pyautogui.moveTo(100, 150)

鼠标点击

# pyautogui.click()
# 先移动到指定位置再点击鼠标
pyautogui.click(x=818, y=1568, clicks=2, interval=2, button="LEFT", duration=3)
# 其他点击操作
pyautogui.mouseDown()   # 按下鼠标按键(默认左键)
pyautogui.mouseUp()     # 释放鼠标按键(默认左键)

参数说明:
x:X轴坐标,默认为 None,即当前X轴坐标

y:Y轴坐标,默认为 None,即当前Y轴坐标(注:X,Y 轴的坐标只能同时指定,不能只指定某一个)

clicks:鼠标的点击次数,默认为 1 次

intervalint 或浮点数,表示每次单击之间需要等待多少秒,默认值为0.0,表示单击之间没有暂停

button:可选 LEFTMIDDLERIGHTPRIMARY(左键)或 SECONDARY(右键)。它的默认值是 PRIMARY

duration:如果指定了 X,Y 的值,并且该坐标不是鼠标当前位置的话,那么 duration 参数就可以生效,它表示移动到指定坐标花费的时间,默认为 0,表示立即移动。

找到屏幕上的指定图片再点击

pyautogui.click("1.png") # 注意找不到图片会抛出错误

移动相对位置

pyautogui.move(400, 0) # 从当前位置往右移动400像素

双击鼠标

pyautogui.doubleClick(818, 1568)

鼠标拖动

pyautogui.dragTo(x=None, y=None, duration=0.0, button="LEFT")     # 将鼠标拖动到指定位置
pyautogui.drag(xOffset=0, yOffset=0, duration=0.0, button="PRIMARY")    # 将鼠标拖动到屏幕上相对于当前位置的一个点。

主要参数:

x,y/xOffsetyOffsetxy 指明鼠标事件发生的位置。如果为 None,则使用鼠标当前位置。如果是浮点值,则将其舍入。如果在屏幕边界之外,则事件发生在屏幕边缘。

duration:如果指定了 XY 的值,并且该坐标不是鼠标当前位置的话,那么 duration 参数就可以生效,它表示移动到指定坐标花费的时间,默认为 0,表示立即移动。

button:可选 LEFTMIDDLERIGHTPRIMARY(左键)或 SECONDARY(右键)。它的默认值是 PRIMARY

鼠标滚动

垂直滚动,在不同平台滚动的效果可能不一样。

# pyautogui.scroll(100)   # 向上滚动100
# pyautogui.scroll(-100)  # 向下滚动100
pyautogui.scroll(-5000, x=300, y=500)  # 移动到300, 500, 然后执行滚动

水平滚动,(适用与 OS X 和 Linux 平台上)。

pyautogui.hscroll(100)   # 向右滚动100
pyautogui.hscroll(-100)   # 向左滚动100

屏幕功能

截屏功能

使用 screenshot() 函数来实现截屏功能。调用 screenshot() 将返回一个 Image 对象。传入一个文件名字符串将把截图保存到文件中,并将其作为一个 Image 对象返回。通过 region 关键字参数来捕获指定区域,只需传递一个由 left, top, width, height 组成的元组(left,top为左上角坐标)。

pyautogui.screenshot()
pyautogui.screenshot(r'test_fullscreen.png')  # 默认截取全屏
pyautogui.screenshot(r'test_region.png', region=(300, 300, 500, 1000))  # 截取指定区域

定位功能

如果不知道要点击的内容在屏幕上的确切坐标,就不能调用 moveTo()click() 函数。但是,如果有按钮的图像,如下面这个图片,那就可以调用 locateOnScreen('图片路径') 函数来获取坐标。返回值是一个元组:(left, top, width, height)。这个元组可以传递给 center() 来获得该区域中心的坐标(X,Y)。如果在屏幕上找不到图像,locateOnScreen() 将引发 ImageNotFoundException 异常。

location = pyautogui.locateOnScreen('1.png')
pyautogui.center(location)

消息框功能

PyAutoGUI 利用 PyMsgBox 中的消息框函数提供了一种跨平台的纯 Python 方法来显示 javascript 样式的消息框。

alert()函数

pyautogui.alert(text='text', title='title', button='alert!')

confirm()函数

显示带有多个按钮的消息框。按钮的数量和文字可以自己设置。单击按钮返回该按钮的文本。

pyautogui.confirm(text='text', title='title', buttons=['再考虑一下', '卸载'])

prompt()函数

显示一个包含 确认,取消 按钮和文本输入栏的消息框,用户可以输入指定内容。当点击确认按钮后,返回输入框中的值;若点击取消,则返回 None

pyautogui.prompt(text='text', title='title', default='请输入文本信息')

password()函数

显示一个包含 确认,取消 按钮和文本输入栏的消息框,输入的字符显示为"*"。如果点击确认则返回输入的文本;如果单击“取消”,则为 None 。

pyautogui.password(text='text', title='title', default='密码', mask='*')

键盘控制功能

write()函数

write()函数将在传入的字符串中键入字符。若要在按下每个字符键之间添加延迟间隔,interval参数可以设置每个按键之间添加延迟。

pyautogui.write('Hello world!', interval=0.25)    # 每个字符间隔0.25秒

注意:pyautogui 并不支持输入框自动聚焦,所有输入之前先要点击输入框位置。

press()函数

press() 函数执行的操作相当于鼠标操作的 click(),它接收传递给它的字符串。

pyautogui.press('num0', presses=1, interval=0.0)

keys:传入的键盘字符串
presses:操作按键次数,默认一次
interval:每次按键的间隔时间,默认0

keys 所有取值如下:

['\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']

hotkey()函数

接收多个字符串参数,顺序按下,再按相反的顺序释放。

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

# 相当于
pyautogui.keyDown('ctrl')    # 按下 ctrl 
pyautogui.keyDown('shift')    # 按下 shift
pyautogui.keyDown('esc')    # 按下 esc
pyautogui.keyUp('esc')    # 释放 ctrl 
pyautogui.keyUp('shift')    # 释放 shift
pyautogui.keyUp('ctrl') # 释放 esc

PyAutoGUI图片定位常用三种方式

loacteOnScreen()定义图片整体位置

print(pyautogui.locateOnScreen('1.png'))
print(type(pyautogui.locateOnScreen('1.png')))

locateOnScreen定位图片,会返回一个pyscreeze.Box(left,top,width,height),lefttop是图片左上角的坐标,width和height是图片的宽和高。

center()

返回locateOnScreen获取图片整体位置的中心点

img = pyautogui.locateOnScreen('1.png')
Center = pyautogui.center(img)
print(Center)
print(type(Center))

center可以根据locateOnScreen定位图片的位置,会返回一个pyscreeze.Point格式的图片中心左边点Point(x=test1,y=test2),可以通过Point().x 来获取Pointx的值,也可以通过Point().y 来获取Pointy的值。

locateCenterOnScreen()定位图片的中心点

print(pyautogui.locateCenterOnScreen('1.png'))
print(type(pyautogui.locateCenterOnScreen('1.png')))

locateCenterOnScreen()相当于是locateOnScreen()center()的结合。 返回值也和center()的返回值一样。

图像定位不稳定解决方案

方案介绍

  • 模糊定位:借助opencv的来提高识别率,在local函数中加入confidence参数,也就是识别准确度,当confidence越小时,定位的精度就会越低,从而实现模糊定位。

  • 灰度匹配:在local函数中加入grayscale参数,当grayscale=True时会使图像和屏幕截图中的颜色去饱和,可以解决由于显示器饱和度不同从而引起的颜色细微差异因而导致的图像定位失败问题。

  • 指定范围:在local函数中加入region参数,可以控制找图范围,从而提高找图效率。

  • 多图定位:icon在不同场景下可能有不同的显示效果,可以把不同显示效果的多张图片归为一个事件,对多张图进行循环查找,定位一张图就可以对整个事件进行定位。

模糊查询

opencv的安装命令:

pip install opencv-python

pyautogui.locateOnScreen()函数中加入confidence参数,当confidence的值决定精度

t = pyautogui.locateOnScreen('1.png', confidence=0.8)
print(pyautogui.center(t))
Point(x=200, y=913)

灰度匹配

pyautogui.locateOnScreen()函数中加入grayscale=True,就可以实现灰度匹配

t = pyautogui.locateOnScreen('1.png', grayscale=True)
print(pyautogui.center(t))

指定范围

local函数中加入region参数,可以控制找图范围,从而提高找图效率。

region(x,y,width,height),其中x,y为范围左上角坐标,width,height为范围的宽和高。

t = pyautogui.locateOnScreen('1.png', grayscale=True, region=(100, 900, 300, 1000))
print(pyautogui.center(t))

多图定位

可以对一个icon截多张不同的图,每一张图都代表这个icon,只要定位其中一张图就能定位这个icon

locateOnScreent()函数进行二次封装,多张图片之间用 | 间隔,实现循环找图。

from pyautogui import *
 
#把字符串按'|'切割
def word_cut(args):
    tup = []
    if '|' in args:
        re1 = args.split('|')
        return re1
    else:
        tup.append(args)
        return tuple(tup)
 
#判断图像是否找到,如果找到就返回True,没找到就跳过
def assertPIC(args):
    if locateOnScreen(args) == None:
        pass
    else:
        return True
 
#循环找图,找到就返回图像中心点,没找到就打印'没找到'
def img_locat(args):
    arg = word_cut(args)
    for i in range(len(arg)):
        if assertPIC(arg[i]):
            return center(locateOnScreen(arg[i]))
        else:
            print('没找到')
 
#测试
print(img_locat('1.png'))
Point(x=200, y=914)
posted @ 2024-05-20 00:19  Apostle浩  阅读(135)  评论(0编辑  收藏  举报