• 使用Python进行GUI操作自动化


    前言

    本文介绍怎样使用Python进行跨平台的GUI操作的,其中使用的一个工具包是pyautogui,PyAutoGUI可以模拟鼠标的移动、点击、拖拽,键盘按键输入、按住操作,以及鼠标+键盘的热键同时按住等操作,可以说手能动的都可以。

    安装

    首先安装该工具包在Linux平台上的依赖
    对于Python2

    sudo python-xlib 
    

    对于Python3

    sudo apt-get install python3-Xlib
    

    接着安装pyautogui

    sudo pip2 install pyautogui
    

    测试

    首先用一个简单的示例来检验一下安装是否正常(移动鼠标的位置)

    >>>import pyautogui
    >>> screenWidth, screenHeight = pyautogui.size()
    >>> pyautogui.moveTo(screenWidth / 2, screenHeight / 2)
    

    如果鼠标指针移动到了电脑屏幕的中间,就说明安装的工具包可以正常工作.

    一个有趣的示例:

    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')
    

    这个例子是拖动鼠标在MS paint中绘制方形螺旋形状(任何图形绘制程序都行):
    接着

    distance = 200
    while distance > 0:
            pyautogui.dragRel(distance, 0, duration=0.5)   # move right
            distance -= 5
            pyautogui.dragRel(0, distance, duration=0.5)   # move down
            pyautogui.dragRel(-distance, 0, duration=0.5)  # move left
            distance -= 5
            pyautogui.dragRel(0, -distance, duration=0.5)  # move up
    

    结果如下:

    使用

    一切为了安全

    一切安全第一^_^,你写的程序也许会失控哦,尤其是和GUI相关的.为了能够及时中断,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).

    作弊条

    • 常用函数
    pyautogui.position() #当前鼠标坐标 x , y
    pyautogui.size() #当前屏幕的宽,高
    pyautogui.onScreen(x,y) #如果(x,y)在屏幕范围内为True
    
    • 安全
     pyautogui.PAUSE = 2.5 #每个PyAutoGUI调用暂停2.5秒
    

    当pyautogui.FAILSAFE = True时,如果把鼠标光标在屏幕左上角,PyAutoGUI函数就会产生pyautogui.FailSafeException异常。

    pyautogui.FAILSAFE = True
    
    • 鼠标相关

    坐标系的原点是左上角。X轴(水平)坐标向右增大,Y轴(竖直)坐标向下增大。

    num_seconds = 1.2
    #  用num_seconds秒的时间把光标移动到(x, y)位置
    pyautogui.moveTo(x, y, duration=num_seconds)
    #  用num_seconds秒的时间把光标的X轴(水平)坐标移动xOffset,
    #  Y轴(竖直)坐标向下移动yOffset。
    xOffset, yOffset = 50, 100
    pyautogui.moveRel(xOffset, yOffset, duration=num_seconds)
    

    click()函数就是让鼠标点击,默认是单击左键,参数可以设置:

    pyautogui.click(x=moveToX, y=moveToY, clicks=num_of_clicks, interval=secs_between_clicks, button='left')
    

    其中,button属性可以设置成left,middle和right。

    所有的点击都可以用这个函数,不过下面的函数可读性更好:

    pyautogui.rightClick(x=moveToX, y=moveToY)
    pyautogui.middleClick(x=moveToX, y=moveToY)
    pyautogui.doubleClick(x=moveToX, y=moveToY)
    pyautogui.tripleClick(x=moveToX, y=moveToY)
    

    scroll函数控制鼠标滚轮的滚动,amount_to_scroll参数表示滚动的格数。正数则页面向上滚动,负数则向下滚动:

    pyautogui.scroll(clicks=amount_to_scroll, x=moveToX, y=moveToY)
    

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

    pyautogui.mouseDown(x=moveToX, y=moveToY, button='left')
    pyautogui.mouseUp(x=moveToX, y=moveToY, button='left')
    
    • 键盘函数
      键盘上可以按的键都可以调用:
    #  每次键入的时间间隔
    secs_between_keys = 0.1
    pyautogui.typewrite('Hello world!
    ', interval=secs_between_keys)
    

    多个键也可以:

    pyautogui.typewrite(['a', 'b', 'c', 'left', 'backspace', 'enter', 'f1'], interval=secs_between_keys)
    

    按键名称列表:

    pyautogui.KEYBOARD_KEYS[:10]
    

    键盘的一些热键像Ctrl-S或Ctrl-Shift-1都可以用hotkey()函数来实现:

    pyautogui.hotkey('ctrl', 'a') # 全选
    pyautogui.hotkey('ctrl', 'c') # 复制
    pyautogui.hotkey('ctrl', 'v') # 粘贴
    

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

    pyautogui.keyDown(key_name)
    pyautogui.keyUp(key_name)
    
    • 消息弹窗函数
      如果你需要消息弹窗,通过单击OK暂停程序,或者向用户显示一些信息,消息弹窗函数就会有类似JavaScript的功能:
    pyautogui.alert('这个消息弹窗是文字+OK按钮')
    pyautogui.confirm('这个消息弹窗是文字+OK+Cancel按钮')
    pyautogui.prompt('这个消息弹窗是让用户输入字符串,单击OK')
    

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

    • 截屏函数
      PyAutoGUI用Pillow/PIL库实现图片相关的识别和操作。

    在Linux里面,你必须执行sudo apt-get install scrot来使用截屏特性。

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

    如果你有一个图片文件想在上面做点击操作,你可以用locateOnScreen()函数来定位。

    #  返回(最左x坐标,最顶y坐标,宽度,高度)
    pyautogui.locateOnScreen('pyautogui/looks.png')
    locateAllOnScreen()函数会寻找所有相似图片,返回一个生成器:
    for i in pyautogui.locateAllOnScreen('pyautogui/looks.png'):
        print(i)
    list(pyautogui.locateAllOnScreen('pyautogui/looks.png'))
    locateCenterOnScreen()函数会返回图片在屏幕上的中心XY轴坐标值:
    pyautogui.locateCenterOnScreen('pyautogui/looks.png')
    

    如果没找到图片会返回None。定位比较慢,一般得用1~2秒

    光标位置记录程序Python 2版本是:

    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 '' * (len(positionStr) + 2),
            sys.stdout.flush()
    except KeyboardInterrupt:
        print '
    '
    

    更详细信息请访问参考资料中的链接
    参考资料

  • 相关阅读:
    BZOJ 3156 防御准备
    codevs 1033 蚯蚓的游戏问题
    BZOJ 3669 【NOI2014】 魔法森林
    分享知识-快乐自己:全面解析 java注解实战指南
    分享知识-快乐自己:MySQL中的约束,添加约束,删除约束,以及一些其他修饰
    分享知识-快乐自己:Oracle基本语法(创建:表空间、用户、授权、约束等)使用指南
    分享知识-快乐自己: Oracle数据库实例、用户、表、表空间之间关系
    分享知识-快乐自己:oracle12c创建用户提示ORA-65096:公用用户名或角色无效
    分享知识-快乐自己:论 Mybatis中的关联关系(一对多,多对一,多对多)
    分享知识-快乐自己:JAVA中的 Iterator 和 Iterable 区别
  • 原文地址:https://www.cnblogs.com/taceywong/p/5733134.html
Copyright © 2020-2023  润新知