• PyAutoGUI 简介


    转载来自:

    https://muxuezi.github.io/posts/doc-pyautogui.html

    http://blog.topspeedsnail.com/archives/5373

    ---------------------------------------------------------------------------------------------------------

    PyAutoGUI是一个纯Python的GUI自动化工具,其目的是可以用程序自动控制鼠标和键盘操作,利用它可以实现自动化任务,再也不用担心有重复枯燥的任务了。

    安装:

    pip install pyautogui

    或在pipy直接下载install

    在Py3中安装提示:

    Collecting PIL
      Could not find a version that satisfies the requirement PIL (from versions: )
    No matching distribution found for PIL

    依赖包PIL,Py3不支持,可以安装Pillow 代替:PIL, 然后在install pyautogui

    pip install pillow

    例子

    import pyautogui
    screenWidth, screenHeight = pyautogui.size()
    currentMouseX, currentMouseY = pyautogui.position()
    pyautogui.moveTo(100, 150)
    pyautogui.click()
    #  鼠标向下移动10像素
    pyautogui.moveRel(None, 10)
    pyautogui.doubleClick()
    #  用缓动/渐变函数让鼠标2秒后移动到(500,500)位置
    #  use tweening/easing function to move mouse over 2 seconds.
    pyautogui.moveTo(1800, 500, duration=2, tween=pyautogui.easeInOutQuad)
    #  在每次输入之间暂停0.25秒
    pyautogui.typewrite('Hello world!', interval=0.25)
    pyautogui.press('esc')
    pyautogui.keyDown('shift')
    pyautogui.press(['left', 'left', 'left', 'left', 'left', 'left'])
    pyautogui.keyUp('shift')
    pyautogui.hotkey('ctrl', 'c')

    保护措施(Fail-Safes)

    Python移动鼠标、点击键盘非常快,有可以导致其他应用出现问题。在这种情况下,程序可能会失控(即使是按照你的意思执行的),那时就需要中断。如果鼠标还在自动操作,就很难在程序窗口关闭它。

    为了能够及时中断,PyAutoGUI提供了一个保护措施。当pyautogui.FAILSAFE = True时,如果把鼠标光标在屏幕左上角,PyAutoGUI函数就会产生pyautogui.FailSafeException异常。如果失控了,需要中断PyAutoGUI函数,就把鼠标光标在屏幕左上角。要禁用这个特性,就把FAILSAFE设置成False

    import pyautogui
    pyautogui.FAILSAFE = False

    通过把pyautogui.PAUSE设置成floatint时间(秒),可以为所有的PyAutoGUI函数增加延迟。默认延迟时间是0.1秒。在函数循环执行的时候,这样做可以让PyAutoGUI运行的慢一点,非常有用。例如:

    import pyautogui
    pyautogui.PAUSE = 2.5
    pyautogui.moveTo(100,100); pyautogui.click()

    所有的PyAutoGUI函数在延迟完成前都处于阻塞状态(block)。(未来计划增加一个可选的非阻塞模式来调用函数。)

    建议PAUSEFAILSAFE一起使用。

    移动鼠标

    PyAutoGUI使用x,y坐标,屏幕左上角坐标是(0, 0)。

    使用pyautogui.size()函数获得屏幕的分辨率:

    import pyautogui
     
    pyautogui.size()
    # (1366, 768)
    width, height = pyautogui.size()

    moveTo函数,绝对坐标

    import pyautogui
    for i in range(10):
          pyautogui.moveTo(300, 300, duration=0.25)
          pyautogui.moveTo(400, 300, duration=0.25)
          pyautogui.moveTo(400, 400, duration=0.25)
          pyautogui.moveTo(300, 400, duration=0.25)

    上面代码让鼠标顺时针移动,并划10次方框。

    划圆:

    import pyautogui
    import math
     
    width, height = pyautogui.size()
     
    r = 250  # 圆的半径
    # 圆心
    o_x = width/2
    o_y = height/2
     
    pi = 3.1415926
     
    for i in range(10):   # 转10圈
        for angle in range(0, 360, 5):  # 利用圆的参数方程
            X = o_x + r * math.sin(angle*pi/180)
            Y = o_y + r * math.cos(angle*pi/180)
     
            pyautogui.moveTo(X, Y, duration=0.1)

    moveRel()函数,相对坐标。以当前鼠标所在位置为基点:

    import pyautogui
     
    for i in range(10):
        pyautogui.moveRel(100, 0, duration=0.25)
        pyautogui.moveRel(0, 100, duration=0.25)
        pyautogui.moveRel(-100, 0, duration=0.25)
        pyautogui.moveRel(0, -100, duration=0.25)

    获得鼠标所在坐标:

    import pyautogui
     
    x, y = pyautogui.position()

    实时获得鼠标位置坐标:

    import pyautogui
    try:
        while True:
            x, y = pyautogui.position()
            print(x,y)
    except KeyboardInterrupt:
        print('
    Exit.')

    鼠标点击、拖拽和滚轮

    鼠标点击

    使用click()函数发送虚拟鼠标点击,默认情况下在鼠标所在的位置点击左键。函数原型:

    pyautogui.click(x=cur_x, y=cur_y, button='left')
    • x,y是要点击的位置,默认是鼠标当前位置
    • button是要点击的按键,有三个可选值:‘left’‘middle’,  ‘right’

    要在当前位置点击右键:

    import pyautogui
     
    pyautogui.click(button='right')

    click函数完成了一次鼠标点击。一次完整的点击包括两部分,按下mouseDown()和弹起mouseUp()。上面这两个函数参数和click函数一样,其实click函数只是简单的封装了mouseDown()和mouseUp()函数。

    import pyautogui
     
    pyautogui.click(100, 100)

    每个按键按下和松开两个事件可以分开处理:

    pyautogui.mouseDown(x=moveToX, y=moveToY, button='left')
    pyautogui.mouseUp(x=moveToX, y=moveToY, button='left')
    • pyautogui.doubleClick():鼠标双击,其实就是执行两次click()函数。
    • pyautogui.rightClick():右击
    • pyautogui.middleClick():中击

    鼠标拖拽

    拖拽的意思是:按下鼠标键并拖动鼠标。PyAutoGUI提供了两个函数:dragTo() 和 dragRel()。它的参数和moveTo() 和 moveRel() 一样。

    注意:duration时间不能太短,拖动太快有些系统会吃不消。

    要做多次单击可以设置clicks参数,还有interval参数可以设置每次单击之间的时间间隔。例如:

    #  双击左键
    pyautogui.click(clicks=2)
    #  两次单击之间停留0.25秒
    pyautogui.click(clicks=2, interval=0.25)
    #  三击右键
    pyautogui.click(button='right', clicks=2, interval=0.25)

    滚轮

    使用函数scroll(),它只接受一个整数。如果值为正往上滚,值为负往下滚。

    pyautogui.scroll(200)

    定位某个按钮的位置

    pyautogui有截屏功能

    #  返回一个Pillow/PIL的Image对象
    pyautogui.screenshot()
    pyautogui.screenshot('foo.png')

    如果你不需要截取整个屏幕,还有一个可选的region参数。你可以把截取区域的左上角XY坐标值和宽度、高度传入截取。

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

    假如你有一个按钮要10秒种点击一下,这个任务使用上面介绍的函数可以轻松实现。但是我们假设你每次点击这个按钮它都会变换一个位置(随机),这时你该怎么办?下面我们就来解决这个问题。

    首先看一下怎么使用pyautogui截屏:

    import pyautogui
     
    im = pyautogui.screenshot()
     
    # 获得某个坐标的像素
    im.getpixel((50, 200))
    # (30, 132, 153)
     
    # 判断屏幕坐标的像素是不是等于某个值
    pyautogui.pixelMatchesColor(50, 200, (30, 132, 153)) 
    # True

    现在我们来解决前面提出的问题。问题的关键是怎么找到按钮所在的坐标。其实很简单,首先对你要点击的按钮截个图,就叫button.png吧。然后使用locateOnScreen函数找到按钮所在的位置:

    import pyautogui
    pyautogui.locateOnScreen('button.png')
    # (643, 745, 70, 29)

    locateOnScreen其实就是简单的颜色对比,如果有一个像素不匹配,它就会返回None。这个函数返回了匹配图形的坐标,找到中间点:

    x, y = pyautogui.center((643, 745, 70, 29))  # 获得中心点
    pyautogui.click(x, y)
    • locateAllOnScreen():找到所有匹配的位置坐标。

    要检查XY坐标是否在屏幕上,需要用onScreen()函数来检验,如果在屏幕上返回True

    import pyautogui
    pyautogui.onScreen(0, 0)
    # True
    pyautogui.onScreen(0, -1)
    #False

    缓动/渐变(Tween / Easing)函数

    缓动/渐变函数的作用是让光标的移动更炫。如果你不需要用到的话,你可以忽略这些。

    缓动/渐变函数可以改变光标移动过程的速度和方向。通常鼠标是匀速直线运动,这就是线性缓动/渐变函数。PyAutoGUI有30种缓动/渐变函数,可以通过pyautogui.ease*?查看。其中,pyautogui.easeInQuad()函数可以用于moveTo()moveRel()dragTo()dragRel()函数,光标移动呈现先慢后快的效果,整个过程的时间还是和原来一样。而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)

    这些效果函数是模仿Al Sweigart的PyTweening模块,可以直接使用,不需要额外安装。

    如果你想创建自己的效果,也可以定义一个函数,其参数是(0.0,1.0),表示起点和终点,返回值是介于[0.0,1.0]之间的数。

    键盘按键

    输入字符串

    pyautogui.typewrite():

    import pyautogui
     
    pyautogui.click(100, 100)
    pyautogui.typewrite('Hello world!')

    上面的字符串是一次输入,为了唬人可以延迟输入:

    pyautogui.typewrite('Hello world!', 0.25)

    PyAutoGUI输入单个字符还可以,但是一些特殊字符怎么办呢?例如上面输入完Hello World,然后换行继续输入。

    PyAutoGUI键盘表:

    ‘enter’(或‘return’ 或 ‘ ’)

    回车

    ‘esc’

    ESC键

    ‘shiftleft’‘shiftright’

    左右SHIFT键

    ‘altleft’‘altright’

    左右ALT键

    ‘ctrlleft’‘ctrlright’

    左右CTRL

    ‘tab’ (‘ ’)

    TAB

    ‘backspace’‘delete’

    BACKSPACE 、DELETE键

    ‘pageup’‘pagedown’

    PAGE UP 和 PAGE DOWN键

    ‘home’‘end’

    HOME 和 END键

    ‘up’‘down’‘left’,‘right’

    箭头键

    ‘f1’‘f2’‘f3’….

    F1…….F12键

    ‘volumemute’‘volumedown’,‘volumeup’

    有些键盘没有

    ‘pause’

    PAUSE键

    ‘capslock’‘numlock’,‘scrolllock’

    CAPS LOCKNUM LOCK, 和 SCROLLLOCK 键

    ‘insert’

    INSINSERT键

    ‘printscreen’

    PRTSC 或 PRINT SCREEN键

    ‘winleft’‘winright’

    Win键

    ‘command’

    Mac OS X command键

    import pyautogui
     
    pyautogui.click(100, 100)
    pyautogui.typewrite('Hello world!', 0.25)
    pyautogui.typewrite(['enter', 'a', 'b', 'left', 'left', 'X', 'Y'], '0.25')

    按键的按下和释放 和鼠标按键非常类似。

    • keyDown():按下某个键
    • keyUp():松开某个键
    • press():一次完整的击键,前面两个函数的组合。

    alt+F4:

    pyautogui.keyDown('altleft');
    pyautogui.press('f4');
    pyautogui.keyUp('altleft')

    直接使用热键函数:

    pyautogui.hotkey('altleft', 'f4')

     每个按键的按下和松开也可以单独调用:

    pyautogui.keyDown(key_name)
    pyautogui.keyUp(key_name)

    消息弹窗函数

     如果你需要消息弹窗,通过单击OK暂停程序,或者向用户显示一些信息,消息弹窗函数就会有类似JavaScript的功能:

    pyautogui.alert('这个消息弹窗是文字+OK按钮')
    pyautogui.confirm('这个消息弹窗是文字+OK+Cancel按钮')
    pyautogui.prompt('这个消息弹窗是让用户输入字符串,单击OK')

    prompt()函数中,如果用户什么都不输入,就会返回None

    应用

    1.打开浏览器以无痕模式浏览网页

    import pyautogui
    import subprocess
    import win32api
    import time
    prs=subprocess.Popen(["C:\Users\Administrator\AppData\Local\Google\Chrome\Application\chrome.exe  "])
    time.sleep(1)
    pree=pyautogui.hotkey('ctrl', 'shift', 'n')
    
    time.sleep(2)
    pyautogui.typewrite('http://geek.csdn.net/news/detail/86546', interval=0.25)
    pyautogui.press('enter')
    pyautogui.press('enter')
    time.sleep(2)
    win32api.TerminateProcess(int(prs._handle), -1)

    2.将当前屏幕最顶端应用拖拽到坐标(100,200),然后截图

    pyautogui.moveTo(200, 0, duration=0.25)
    pyautogui.mouseDown(button='left')
    #  移动到(100, 200)位置,然后松开鼠标右键
    pyautogui.mouseUp(button='left', x=100, y=200)
    pyautogui.screenshot('foo.png') 截图
  • 相关阅读:
    Django 中间件
    Django之ORM介绍
    ORM相关操作
    Django Form表单
    Django REST framework 中文文档
    前端基础之BOM和DOM
    Django--ORM(2)
    Django--视图
    Django--路由系统
    Django--模板语言
  • 原文地址:https://www.cnblogs.com/dcb3688/p/4607980.html
Copyright © 2020-2023  润新知