您现在的位置是:网站首页 > 博客日记 >

pyautogui基本用法

作者:YXN-python 阅读量:20 发布日期:2024-11-05

介绍

Python的pyautogui库是一种用于自动化任务的强大工具,它可以模拟鼠标和键盘操作,执行各种GUI任务。无论是进行屏幕截图、自动填写表单、自动化测试还是进行GUI操作,pyautogui都可以派上用场。

安装

pip install pyautogui

# 为了更好地使用pyautogui,建议同时安装以下依赖:
pip install pillow
pip install mouseinfo
pip install opencv-python

基本操作

导入

import pyautogui

鼠标操作

获取鼠标当前位置

x, y = pyautogui.position()
print(f"鼠标当前位置: x={x}, y={y}")

移动鼠标

将鼠标移动到指定的坐标位置:

pyautogui.moveTo(100, 100, duration=1)  # 将鼠标移动到(100, 100)的位置,持续1秒

# 缓动/渐变函数可以改变光标移动过程的速度和方向。通常鼠标是匀速直线运动,这就是线性缓动/渐变函数。
# PyAutoGUI有30种缓动/渐变函数,可以通过pyautogui.ease*?查看。

# 开始很慢,不断加速
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)

鼠标点击

pyautogui.click(200, 200)  # 在(200, 200)位置单击鼠标左键

pyautogui.click()  # 左键单击
pyautogui.doubleClick(x=552, y=346)  # 左键双击
pyautogui.rightClick()  # 右键双击
pyautogui.middleClick()  # 中键双击
pyautogui.rightClick()  # 右键单击

鼠标拖拽

pyautogui.dragTo(200, 200, duration=0.2)  # 拖动到指定位置
pyautogui.dragRel(-200, 0, durantion=0.2)  # 相对位置拖动

鼠标长按

# 按下鼠标左键
pyautogui.mouseDown()

# 松开鼠标左键
pyautogui.mouseUp()

# 实际上,click()就是封装了上述两个函数

鼠标滚轮滚动

要模拟鼠标滚轮滚动:

pyautogui.scroll(10)  # 向上滚动10个单位
pyautogui.scroll(-10)  # 向下滚动10个单位

键盘操作

键盘输入

模拟键盘输入:

pyautogui.typewrite("Hello, World!")  # 输入文本

模拟快捷键

模拟快捷键:

# 回车
pyautogui.press('enter')

pyperclip.copy("中文English") # 复制

# 组合键
pyautogui.hotkey("ctrl", "c")  # 模拟Ctrl+C

# 打开文件资源管理器
pyautogui.hotkey('win', 'e')

# 等待文件资源管理器打开
pyautogui.sleep(1)

# 复制文件
pyautogui.hotkey('ctrl', 'c')

# 切换到另一个文件夹
pyautogui.hotkey('ctrl', 'v')

按下和释放键盘按键

按下和释放键盘按键:

pyautogui.keyDown("shift")  # 按下Shift键
pyautogui.keyUp("shift")  # 释放Shift键

消息框、输入框

PyAutoGUI 提供了简单的消息框和输入框功能

import pyautogui

# 显示一个消息框
pyautogui.alert('这是一个警告框!')

# 显示确认框,返回用户选择的结果
response = pyautogui.confirm('你想继续吗?', buttons=['继续', '取消'])

if response == 'OK':
    print('用户选择继续')
else:
    print('用户取消了操作')

# 显示一个输入框,接收用户输入
user_input = pyautogui.prompt('请输入您的姓名:')
print(f'用户输入: {user_input}')

# 样式同prompt(),用于输入密码,消息用*表示。
pyautogui.password(text='', title='', default='', mask='*')

等待和延迟

延迟执行

使用`pyautogui.sleep()`函数,可以添加延迟以等待操作完成:

pyautogui.sleep(2)  # 等待2秒

等待特定的图像出现、查找图片位置

pyautogui.locateOnScreen()函数可以用于等待并定位屏幕上的特定图像,以便后续操作:

使用 confidence 参数,pyautogui 需要 opencv-python 库支持。可以通过以下命令安装:

pip install opencv-python

# 可选的 confidence 参数用于允许一定的匹配误差),找不到会报错 pyautogui.ImageNotFoundException
location = pyautogui.locateOnScreen("image.png", confidence=0.8)  
if location is not None:
    x, y, width, height = location
    pyautogui.click(x + width / 2, y + height / 2)

`pyautogui` 库依赖于 `pyscreeze` 库进行图像识别。在 `pyscreeze` 的 `__init__.py` 文件中,有一个 `USE_IMAGE_NOT_FOUND_EXCEPTION` 配置项,当设置为 `True` 时,如果没有找到图像会抛出异常。您可以将这个值改为 `False`,这样在找不到图像时会返回 `None` 而不是抛出异常

图像定位

# 发现单个图像
pyautogui.locateOnScreen('summit.png')  
# summit.png为已存在的图像。结果会返回(643, 745, 70, 29),表示屏幕首次发现图像的左x坐标,顶上的y坐标,宽度,高度。若找不到图像,则返回None

# 发现多个图像
list(pyautogui.locateAllOnScreen('summit.png'))  
# 返回一个Generator对象,可以作为list的参数,返回一个四元元组的列表

# 得到图像的中心坐标
cx,cy = pyautogui.center((643, 745, 70, 29)) 
# (678,759)

屏幕

截屏

# 截取整个屏幕
screenshot = pyautogui.screenshot()  # screenshot 是一个Image对象

# 截取指定区域的屏幕
# x, y, width, height 分别未初始坐标xy以及区域宽高
screenshot = pyautogui.screenshot(region=(x, y, width, height))

# 保存截图
screenshot.save('screenshot.png')

获取屏幕尺寸

可以使用以下命令获取屏幕的宽度和高度:

screen_width, screen_height = pyautogui.size()
print(f"屏幕宽度: {screen_width}, 屏幕高度: {screen_height}")

判断坐标是否在屏幕上

pyautogui.onScreen(122, 244)

识别屏幕上的颜色

使用`pyautogui.pixel()`函数,可以获取屏幕上指定位置的像素颜色:

color = pyautogui.pixel(300, 300)
print(f"颜色值:{color}")

# 或者

# 获取坐标(300,300)所在屏幕点的RGB颜色
pix = pyautogui.screenshot().getpixel((300, 300))
positionStr = ' RGB:(' + str(pix[0]).rjust(3) + ',' + str(pix[1]).rjust(3) + ',' + str(pix[2]).rjust(3) + ')'
print(positionStr)  # 打印结果为RGB:( 60, 63, 65)

# 如果你只是要检验一下指定位置的像素值,可以用pixelMatchesColor(x,y,RGB)函数,把X、Y和RGB元组值穿入即可
# 如果所在屏幕中(x,y)点的实际RGB三色与函数中的RGB一样就会返回True,否则返回False
# tolerance参数可以指定红、绿、蓝3种颜色误差范围
pyautogui.pixelMatchesColor(100, 200, (255, 255, 255))
pyautogui.pixelMatchesColor(100, 200, (255, 255, 245), tolerance=10)

比较指定坐标处颜色和给定颜色是否相同

# 前两个参数是x,y坐标,后面是颜色,相同返回True
pyautogui.pixelMatchesColor(50, 200, (255, 255, 255))  

得到图像的中心坐标

cx,cy = pyautogui.center((643, 745, 70, 29))  # (678,759)

查找图像位置

`pyautogui.locateCenterOnScreen()`函数可以用于查找屏幕上特定图像的中心位置:

position = pyautogui.locateCenterOnScreen("image.png")
if position is not None:
    x, y = position
    pyautogui.click(x, y)

屏幕录制

pyautogui还可以用于屏幕录制,以便记录和重放屏幕操作。pyautogui可以与其他库一起使用,如`cv2`(OpenCV)来执行屏幕录制和回放。

以下是如何使用pyautogui进行屏幕录制的简单示例:

import pyautogui
import cv2
import numpy as np

# 设置屏幕录制的区域(示例为整个屏幕)
screen_width, screen_height = pyautogui.size()
fourcc = cv2.VideoWriter_fourcc(*"XVID")
out = cv2.VideoWriter("screen_recording.avi", fourcc, 20.0, (screen_width, screen_height))

# 开始录制
while True:
    # 获取屏幕截图
    screenshot = pyautogui.screenshot()
    frame = np.array(screenshot)
    
    # 将截图添加到录制中
    out.write(frame)
    
    # 显示录制的画面(可选)
    cv2.imshow("Screen Recording", frame)
    
    # 按下q键停止录制
    if cv2.waitKey(1) == ord("q"):
        break

# 停止录制并释放资源
out.release()
cv2.destroyAllWindows()

上述代码创建了一个屏幕录制的视频文件(screen_recording.avi),它不仅捕获屏幕上的图像,还保存录制的视频。可以通过按下 "q" 键来停止录制。

安全机制

# 设置防故障机制
pyautogui.FAILSAFE = True  # 将鼠标移到左上角可中断程序
pyautogui.PAUSE = 1  # 每个pyautogui函数调用后都会等待1秒钟,而非pyautogui不受影响

示例应用

示例 1: 将截图添加到粘贴板

import pyautogui

# 将截图添加到粘贴板
import win32clipboard
from io import BytesIO

def to_clipboard(image):
    # 将Pillow图像对象转换为二进制数据流
    output = BytesIO()
    image.convert('RGB').save(output, 'BMP')
    data = output.getvalue()[14:]  # 跳过BMP文件头
    output.close()
    # 打开剪贴板并清空
    win32clipboard.OpenClipboard()
    win32clipboard.EmptyClipboard()
    # 将图像数据设置到剪贴板
    win32clipboard.SetClipboardData(win32clipboard.CF_DIB, data)
    # 关闭剪贴板
    win32clipboard.CloseClipboard()

screenshot = pyautogui.screenshot()
to_clipboard(screenshot)  # 将截图添加到粘贴板

示例2: 自动化网页操作

import pyautogui
import webbrowser
import time

# 打开浏览器
webbrowser.open('https://www.example.com')

# 等待页面加载
time.sleep(5)

# 模拟滚动鼠标滚轮
pyautogui.scroll(3)  # 向上滚动3次

YXN-python

2024-11-05