• Python自动化之跨平台GUI利器PyAutoGUI


    前言

    PyAutoGUI是一个跨平台GUI自动化Python模块,用于用编程方式控制鼠标和键盘,不仅支持 Windows, 还支持Linux、MAC。

    安装方式:

    pip install pyautogui
    
    • 1

    一、鼠标

    pyautogui 支持以屏幕左上角为原点,往右为X轴正方向,向下为Y轴正方向的坐标系

    1.1 鼠标坐标

    x,y = pyautogui.position()
    
    • 1

    1.2 鼠标移动

    pyautogui.moveTo(100, 200) 
    
    pyautogui.moveTo(None, 500)
    pyautogui.moveTo(600, None)
    
    pyautogui.moveTo(100, 200, 2)
    
    pyautogui.move(0, 50)
    pyautogui.move(0, 50, 2)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    moveTo 函数会将鼠标移动到指定坐标,

    • x,y:XY坐标,如果有None,则会保持相应为None的坐标,移动另一项坐标。
    • 第三个参数 during 是延迟时间,单位为秒。默认是即时。

    move 函数是移动相对应坐标的像素点,向右或向下移动,为负数时则是相反方向。同样支持延迟时间这个参数

    1.3 鼠标拖动

    pyautogui.dragTo(100, 200, button='left')
    pyautogui.dragTo(300, 400, 2, button='left')
    
    pyautogui.drag(30, 0, 2, button='right')
    
    • 1
    • 2
    • 3
    • 4

    dragTo 函数支持鼠标拖动到指定坐标

    • x,y:XY坐标

    • duration: 支持延迟参数。

    • button: 支持选择鼠标的左键、中键或右键

    1.4 鼠标点击

    pyautogui.click()
    pyautogui.click(x=100, y=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)
    
    pyautogui.doubleClick()
    pyautogui.tripleClick()
    pyautogui.rightClick()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    click函数默认当前鼠标位置左键点击,

    • x,y:XY坐标表示移动到给定坐标再点击
    • button:选择left,right,middle
    • clicks:点击次数
    • interval:点击间隔

    1.5 鼠标按下、抬起

    鼠标点击和拖动是由鼠标按下和鼠标抬起两部分组成。如果想单独控制这两部分,可以用下面的函数

    pyautogui.mouseDown(button='right')
    pyautogui.mouseUp(button='right', x=100, y=200)
    
    • 1
    • 2

    1.6 鼠标滚动

    pyautogui 支持鼠标中键进行滚动,scroll 是垂直滚动。在MAC和Linux 还支持水平滚动 hscroll

    pyautogui.scroll(10, x=100, y=100)
    
    pyautogui.hscroll(10)
    
    • 1
    • 2
    • 3

    二、键盘

    2.1 键盘输入

    可以通过write输入单字符按键,不能输入Shift/Alt这种按键

    pyautogui.write('Hello world!', interval=0.25)
    
    • 1

    2.2 键盘按键

    press 表示按下键盘上的按键,press其实可以由 keyDown按下和keyUp抬起组成,当使用组合键时,可以搭配使用

    pyautogui.press('enter')
    
    pyautogui.keyDown('shift')
    pyautogui.press(['left', 'left', 'left'])
    pyautogui.keyUp('shift')
    
    pyautogui.press('left', presses=3)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.3 键盘复合键简化

    pyautogui.keyDown('shift')
    pyautogui.press(['left', 'left', 'left'])
    pyautogui.keyUp('shift')
    # 简化为
    with pyautogui.hold('shift'):
    	pyautogui.press('left', presses=3)
    
        
    pyautogui.keyDown('ctrl')
    pyautogui.keyDown('shift')
    pyautogui.keyDown('esc')
    pyautogui.keyUp('esc')
    pyautogui.keyUp('shift')
    pyautogui.keyUp('ctrl')
    # 简化为
    pyautogui.hotkey('ctrl', 'shift', 'esc')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2.4 键盘按键字符大全

    上面 shift, esc 都可以用于表示键盘的按键,能够用于表示按键的字符可以见文档:https://pyautogui.readthedocs.io/en/latest/keyboard.html#keyboard-keys

    三、弹窗

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

    3.1 alert

    显示一个带有文本和一个确定按钮的简单消息框。返回单击的按钮的文本。

    pyautogui.alert(text='这是弹窗', title='alert弹窗', button='OK')
    
    • 1

    3.2 confirm

    显示带有按钮的消息框。返回单击的按钮的文本。

    pyautogui.confirm(text='Yes or No?', title='confirm弹窗', buttons=['Yes', 'No'])
    
    • 1

    3.3 prompt

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

    pyautogui.prompt(text='输入姓名个数', title='弹窗', default='1')
    
    • 1

    3.4 password

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

    pyautogui.password(text='输入密码', title='弹窗', default='', mask='*')
    
    • 1

    四、屏幕

    4.1 屏幕坐标

    判断坐标是否位于屏幕上

    pyautogui.onScreen(1000, 100)
    
    • 1

    4.2 屏幕大小

    返回屏幕分辩率大小

    pyautogui.size()
    
    • 1

    4.3 截屏

    可通过screenshot 函数进行截屏,还可以截取固定区域的屏幕,四个参数分别是left, top, width, and height (区域左上角坐标和宽高)

    im2 = pyautogui.screenshot('my_screenshot.png')
    im = pyautogui.screenshot('my_screenshot.png', region=(0,0, 300, 400))
    
    • 1
    • 2

    4.4 图片位置

    如果你有一个图像文件,你就可以在屏幕上直观地找到它,可以通过locateOnScreen 用于判断 图片在屏幕中的位置。

    • confidence 是置信度,0-1,可通过配置此参数忽略一些像素差异
    • region 是区域
    • grayscale 灰度匹配,默认False,为True可加快速度,但可能造成 false-positive

    如果没找到,从 0.9.41版本开始会抛出 ImageNotFoundException 异常,之前是返回None。

    找到会返回第一个找到的图像:一个4位整数元祖(left, top, width, height)表示的区域

    此外,还有一些常用的函数

    • center 可获取区域的中心点

    • locateCenterOnScreen 会将locateOnScreen、center两者操作合一

    • locateAllOnScreen:会返回所有满足的图像

    • locate:在图片haystackImage中查找needleImage,而不是从屏幕里

    • locateAll:返回所有满足的图像

    location=pyautogui.locateOnScreen('calc7key.png')
    pyautogui.locateOnScreen('calc7key.png', confidence=0.9, region=(0,0, 300, 400))
    
    pyautogui.center(location)
    pyautogui.locateCenterOnScreen('calc7key.png')
    
    locateAllOnScreen(image, grayscale=False)
    locate(needleImage, haystackImage, grayscale=False)
    locateAll(needleImage, haystackImage, grayscale=False)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    4.5 像素

    # 获取位置像素
    im = pyautogui.screenshot()
    pix = im.getpixel((100, 200))
    
    pix = pyautogui.pixel(100, 200)
    
    # 位置匹配像素,返回True/False
    pyautogui.pixelMatchesColor(100, 200, (130, 135, 144))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    五、配置和常用代码

    5.1 配置

    # 所有pyautogui的指令都要暂停一秒,这样做,可以防止键盘鼠标操作太快
    pyautogui.PAUSE = 1
    # 默认为True, 这项功能意味着:当鼠标的指针在屏幕的最左上方,程序会抛异常 pyautogui.FailSafeException,目的是为了防止程序无法停止
    pyautogui.FAILSAFE = True
    
    • 1
    • 2
    • 3
    • 4

    5.2 常用代码块

    • 复制粘贴

      pyautogui.hotkey('ctrl', 'c') 
      pyautogui.hotkey('ctrl', 'v') 
      
      • 1
      • 2
    • 屏幕定位图片

      try:
      	imagePosition = pyautogui.locateOnScreen('image0.png', confidence=0.9)
      	if imagePosition:
      		pass
      	else:
      		pass
      except ImageNotFoundException:
      	pass
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8

    参考

    1. https://pyautogui.readthedocs.io/en/latest/index.html
  • 相关阅读:
    如何理解UDP和TCP的区别
    进程线程协程补充、docker-compose一键部署项目、搭建代理池、requests超时设置、认证设置、异常处理、上传文件
    帆软下载PDF报错java.lang.OutOfMemoryError: Java heap space
    3D孪生场景搭建:3D漫游
    Java学习06——运算符
    卡音(安卓)
    测试/开发程序员,30而立,你是否觉得迷茫?又当何去何从......
    人生苦短,我用Python 七:如何在flask文档在return后,继续执行文档函数?
    Android硬件服务访问(4):在Application Frameworks层增加硬件访问服务
    自动化测试岗位之百度测开面试题分享
  • 原文地址:https://blog.csdn.net/qq_23091073/article/details/128178280