使用Python PyAutoGUI模块实现键鼠操作

一、鼠标操作

1.安装环境

使用pip命令安装

pip install pyautogui

#该库详细文档 https://pypi.org/project/PyAutoGUI/
#汉化文档 https://github.com/asweigart/pyautogui/blob/master/docs/simplified-chinese.ipynb

2.基础操作

# 导入模块
import pyautogui

# 获取当前鼠标的位置
x, y = pyautogui.position()

# 将鼠标移动到(x, y)的位置,花费t秒时间,(t留空默认0.1秒)
pyautogui.moveTo(x, y, t)
# moveRel() 将鼠标当前所在坐标视为(0,0)

# 将鼠标用左键拖动到(x, y)的位置,花费t秒时间,(t留空默认0.1秒)
pyauto.dragTo(x, y, t, button = 'left')



# 在(100, 100)的位置左键单击
pyautogui.click(100, 100)

# 在(100, 100)的位置右键单击
pyautogui.click(100, 100, button='right')

# 在(100, 100)的位置左键双击
pyautogui . doubleClick(100,100)

· 需要连续滑动时,使用 参数mouseDownUp=False
(需要先使用按下操作)

pyautogui.mouseDown(button='left')#按下鼠标左键
pyautogui.dragTo(200, 200, duration=0.5, button='left', mouseDownUp=False
pyautogui.dragTo(200, 200, duration=0.5, button='left', mouseDownUp=False)
# 一系列操作 都需要mouseDownUp = False
pyautogui.mouseUp(button='left') #松开

注:实际使用中,最后一条drag操作使用mouseDownUp = True的实际体验更好,原因未知,同样使用moveTo() 操作也是可以的。

3.一些小应用

(1)实时获取鼠标位置

#键鼠操作
import pyautogui, sys

#实时监测
print("Press Ctrl-C to exit.") 

try:
    while True:
        x, y = pyautogui.position() #获取鼠标位置
        positionStr = 'X: '+str(x).rjust(4) + 'Y: ' + str(y).rjust(4) #右对齐,长度为4
        print(positionStr, end = '') 
        print('\b' * len(positionStr) , end = '' ,flush = True) #\b为退格符 flush刷新防止延迟显示
except KeyboardInterrupt:
    print( '\n' )

(2)全自动画画

#绘制五角星
import pyautogui as pg
import math
import time

# 计算五角星的外接圆半径
R = 250 / (2 * math.sin(36 * math.pi / 180))

# 计算五角星的中心点坐标
x_c,y_c = pg.size()#  当前屏幕的分辨率(宽度和高度)
x_c /= 2
y_c /= 2

# 计算五角星的五个顶点的坐标
A_x = x_c
A_y = y_c - R
B_x = x_c + R * math.sin(72 * math.pi / 180)
B_y = y_c - R * math.cos(72 * math.pi / 180)
C_x = x_c + R * math.sin(36 * math.pi / 180)
C_y = y_c + R * math.cos(36 * math.pi / 180)
D_x = x_c - R * math.sin(36 * math.pi / 180)
D_y = y_c + R * math.cos(36 * math.pi / 180)
E_x = x_c - R * math.sin(72 * math.pi / 180)
E_y = y_c - R * math.cos(72 * math.pi / 180)



# 移动到顶点E进行按下操作
pg.moveTo(E_x, E_y)
pg.mouseDown(button = 'left')

# 依次拖动到顶点B, D, A, C, E
pg.dragTo(B_x, B_y, 1, button='left',mouseDownUp=False)
pg.dragTo(D_x, D_y, 1, button='left',mouseDownUp=False)
pg.dragTo(A_x, A_y, 1, button='left',mouseDownUp=False)
pg.dragTo(C_x, C_y, 1, button='left',mouseDownUp=False)
pg.dragTo(E_x, E_y, 1, button='left',mouseDownUp=True) #抬起鼠标按钮

画好是这样的~

二,键盘操作

1.主要函数

(1)typewrite()

·本函数用于模拟键盘输入英文字符串,interval 为两次键入之间的时间间隔

import pyautogui

pyautogui.typewrite('Hello world!', interval = 0.1)

注:中文非在键盘上的字符,无法使用typewrite()输出

(2)hotkey()

· 本函数用于键盘热键,即同时按下几个按键

可以调用的键有:

 pyautogui.KEYBOARD_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’

import pyautogui

pyautogui.hotkey('ctrl', 'a') #全选
#可以为上述的任意数量的任意键的组合

(3)keyDown() keyUp()

import pyautogui

pyautogui.keyDown(key_name) #按下按键
pyautogui.keyUp(key_name)  #松开按键
  • hotkey相当于调用keyDown和KeyUp来按下和松开选定的键
  • 2.一些应用

    (1)模拟打字

    import pyautogui as pg
    s = R'''text'''
    pg.typewrite(s,interval=0.08)
    
  • 利用模拟打字,即可在一些打字网站中获得不属于你的打字速度!
  • (2)输入中文

  • 由于typewrite()不支持中文,我们可以使用调用剪切板的方式模拟中文输入
  • import pyautogui as pg
    import pyperclip #需要使用pip安装pyperclip模块
    import time,random
    
    def cprint(t):
        for i in t:
            pyperclip.copy(i) #将字符串t单独迭代出来
            pg.hotkey('ctrl', 'v')  #使用粘贴指令将一个个字粘贴到想要的地方
            time.sleep(random.random()*0.25) # 休眠一段时间,模拟人打字
    

    虽然看着有趣但是没有什么卵用,可以直接省略循环,复制粘贴即可

    三、其他

    1.交互框

    #显示消息框
    import pyautogui
    pyautogui.alert('这是一个通知。')
     
    pyautogui.confirm('是否继续?')
     
    pyautogui.confirm('选择一个选项:', buttons=['A', 'B', 'C'])
    
    pyautogui.prompt('你是谁?')
     
    pyautogui.password('请输入密码 (文本会被隐去)')
    
    #用户选择的提取:
    choice = pyautogui.confirm('选择一个选项:', buttons=['A', 'B', 'C']
    print(choice)
    
    

    2.图像相关

    (1)屏幕截图

    #截图
    import pyautogui
    
    #两种保存截图的方式 截图保存在工作目录下
    im1 = pyautogui.screenshot()
    im1.save('my_screenshot.png')
    
    im2 = pyautogui.screenshot('my_screenshot2.png')
    
    

    (2)图形匹配

    import pyautogui
    
    #参数为需要匹配的图形文件路径
    button7location = pyautogui.locateOnScreen('button.png')
    
    print(button7location)
    #返回一个四元元组,分别为图形左上顶点坐标,宽度,高度
    

    (*宽度高度返回的是用来匹配的图形的宽高,就是被匹配图形有缩放 返回的宽高依然不变。。。不明白)

    (3)灰度值匹配

    locateOnScreen()函数可以把grayscale参数设置为True来加速定位(大约提升30%),默认为False。这种去色(desaturate)方法可以加速定位,但是也可能导致假阳性(false-positive)匹配。
    参数grayscale是一个布尔值,表示是否使用灰度匹配。如果设置为True,那么pyautogui会将屏幕截图和匹配图片都转换为灰度,从而忽略颜色的差异,提高匹配的速度和准确度。如果设置为False,那么pyautogui会保留原始的颜色,但可能导致匹grayscale是一个布尔值,表示是否使用灰度匹配。如果设置为True,那么pyautogui会将屏幕截图和匹配图片都转换为灰度,从而忽略颜色的差异,提高匹配的速度和准确度。如果设置为False,那么pyautogui会保留原始的颜色,但可能导致匹配失败或误匹配。

    import pyautogui
    
    button7location = pyautogui.locateOnScreen('button.png', grayscale=True)
    
    print(button7location)
    

    经过色调转换后的图片,由于其灰度不变,仍然会被成功匹配
    原图片

    色调转换

    (4)模糊匹配

    需要安装库:

    pip install opencv-python
    

    用于图片有缩放时的匹配

    confidence是一个浮点数,表示匹配的相似度阈值,范围是0到1。如果设置为1,那么pyautogui只会返回完全相同的匹配结果。如果设置为0,那么pyautogui会返回任何匹配结果。如果设置为0.9,那么pyautogui会返回至少90%相似的匹配结果。confidence参数可以用来处理一些微小的像素差异,或者匹配缩放后的图片。

    (5)图形中心

    图形中心可以由如下语句直接得出

    #button7location为四元元组
    buttonx, buttony = pyautogui.center(button7location)
    pyautogui.click(buttonx, buttony)
    #点击发现的按钮中心(妈妈再也不用担心我误触广告啦)
    

    (6)获取某处像素颜色

  • 静态获取
  • # 静态方法
    import pyautogui
    
    im = pyautogui.screenshot()  #先获取屏幕截图
    a = im.getpixel((100, 200)) #获取坐标点(100,200)处的像素RGB颜色
    print(a)
    
    #返回 (247, 247, 247)
    
  • 动态获取
  • # 动态方法
    import pyautogui as pg
    
    print('按ctrl-c退出~')
    
    try:
        while True:
            x,y = pg.position() #获取鼠标位置
            color = str(pg.pixel(x,y)).rjust(15) #用pixel()获取点x,y处的像素RGB颜色
            print(color,end = '')
            print('\b'*len(color),end = '',flush = True)
            
    except KeyboardInterrupt:
        print("fine\n")
    #会实时获取鼠标处的颜色
    
  • 颜色检验
  • import pyautogui
    
    # 检验坐标(100,200)处的RGB颜色是否等于(255,255,255)
    # 传入三个参数,前两个为坐标,第三个为RGB颜色的三元组
    pyautogui.pixelMatchesColor(100, 200, (255, 255, 255))
    # 返回布尔值
    
    #可选参数tolerance 为RGB颜色容差
    pyautogui.pixelMatchesColor(100, 200, (255, 255, 245), tolerance=10)
    

    (7)应用-打靶

  • 使用图像识别来点击屏幕中出现的目标
  • import pyautogui
    import os
    
    os.chdir('E:/Python') #切换工作路径
    
    while True:
        try:   
            while True:
                buttonx, buttony = pyautogui.locateCenterOnScreen('target.png',grayscale = True,confidence = 0.7)
                pyautogui.click(buttonx, buttony)  #返回匹配图像的中心坐标,点击
            
        except pyautogui.ImageNotFoundException: #无匹配图像
            print("没有匹配的图像!")
    
        except IOError:   #路径错误
            print("文件路径有误,请检查!")
    

    3.安全性

    为了保证一定的安全,可以使用一些方法让程序运行可控

    下面是一些措施:

    (1)鼠标滑动取消

    #开启时,鼠标移动到屏幕边缘便会抛出异常
    pyautogui.FAILSAFE = True
    

    将鼠标快速滑动到角落,便会抛出该错误。
    pyautogui.FailSafeException: PyAutoGUI fail-safe triggered from mouse moving to a corner of the screen. To disable this fail-safe, set pyautogui.FAILSAFE to False. DISABLING FAIL-SAFE IS NOT RECOMMENDED.

    (2)运行前审查

    #在执行前加入检查时间
    import pyautogui
    pyautogui.PAUSE = 2.5
    

    本文由Failur整理编写,转载请注明出处。文中如有错误欢迎留言指正。文中出现的图片为互联网素材,如有侵权请联系删除。

    物联沃分享整理
    物联沃-IOTWORD物联网 » 使用Python PyAutoGUI模块实现键鼠操作

    发表评论