从PyAutoGUI开始,笨办法完成半天工作

发布时间 2023-03-22 22:18:43作者: 梦想截留时光

前言

近期有同事提了一下想用一些简单的自动化替代目前一些简单的导出整理发邮件的需求,才意识到我们当前的工作中还有很多人处于很低效的状态,于是结合现状,决定以pyautogui为例,利用chatgpt快速制作了简单的入门课程分享,希望能引大家有思路,开始实践,切实改善现状。

简介

PyAutoGUI是什么?

PyAutoGUI是Python自动化GUI操作库,它可以模拟鼠标和键盘操作,以及进行屏幕截图和像素检测等操作,可以用于自动化测试、办公自动化、游戏辅助等场景。PyAutoGUI可以在Windows、macOS和Linux等多种平台上使用。

PyAutoGUI的安装和验证方法

安装pyautogui可以通过以下步骤实现:

  1. 安装Python:首先需要安装Python,可以从Python官网下载安装包,根据提示进行安装即可。
  2. 安装pyautogui:可以使用pip命令来安装pyautogui,命令如下:
pip install pyautogui
  1. 安装完成后,可以在Python命令行中通过import语句导入PyAutoGUI库,并使用size()函数获取屏幕尺寸、position()函数获取鼠标当前位置等进行验证,具体代码如下方所示。
import pyautogui

# 获取屏幕尺寸
screen_size = pyautogui.size()
print("Screen size:", screen_size)

# 获取鼠标当前位置
mouse_position = pyautogui.position()
print("Mouse position:", mouse_position)

这段代码可以获取当前屏幕的尺寸和鼠标的位置,并打印输出到控制台。如果没有报错并且输出结果与实际情况相符,则说明PyAutoGUI安装成功并可以正常使用。

基本功能

PyAutoGUI库的概述

PyAutoGUI库的常用功能包括:

  • 鼠标控制:包括鼠标移动、鼠标点击、鼠标拖拽等操作。
  • 键盘操作:包括模拟按键、组合键操作等。
  • 屏幕截图:包括截取全屏、截取指定区域等。
  • 图片定位:可以根据图片或颜色定位。
  • 消息对话框:可以弹出消息对话框。
  • 窗口操作:包括获取窗口句柄、最大化、最小化、还原窗口、关闭窗口等。

鼠标控制

PyAutoGUI库提供了丰富的鼠标控制功能,可以通过moveTo()函数和moveRel()函数控制鼠标的移动,包括绝对位置移动和相对位置移动。可以通过click()函数控制鼠标的点击操作,包括左键、右键和中键,可以指定点击次数、点击间隔和鼠标移动过渡时间等。
可以通过locateCenterOnScreen()函数和locateOnScreen()函数进行图片或颜色的定位,然后使用moveTo()函数和click()函数控制鼠标的移动和点击操作。
下方代码演示了如何使用PyAutoGUI库控制鼠标的移动和点击操作,以及如何使用图片定位功能进行自动化操作。

import pyautogui

# 获取屏幕尺寸
sizex, sizey = pyautogui.size()

# 绝对位置移动,移动至屏幕正中心,鼠标移动过渡时间duration设为1秒
pyautogui.moveTo(sizex/2, sizey/2, duration=1)

# 相对位置移动,向右100、向上200,鼠标移动过渡时间duration设为0.5秒
pyautogui.moveRel(100, -200, duration=0.5)

# 移动至屏幕中心点击一下左键,过渡时间0.5秒
pyautogui.click(sizex/2, sizey/2, duration=0.5)

# 不指定x、y,在当前位置点击一下右键
pyautogui.click(button='right')

# 移动至(100,100)点击3次左键,点击间隔0.1s,鼠标移动过渡时间0.5秒
pyautogui.click(100, 100, clicks=3, interval=0.1, duration=0.5)

# 移动至(100,100)点击2次右键,点击间隔0.5s,鼠标移动过渡时间0.2秒
pyautogui.click(100, 100, clicks=2, interval=0.5, button='right', duration=0.2)

# 图片定位,移动鼠标并点击
loc = pyautogui.locateCenterOnScreen("icon_xx.png", region=(0, 0, sizex/2, sizey/10))
pyautogui.moveTo(*loc, duration=0.5)
pyautogui.click(clicks=1)

键盘操作

PyAutoGUI库提供了丰富的键盘操作功能,可以通过typewrite()函数和press()函数控制键盘的输入,包括单个字符、字符串、组合键等。可以通过hotkey()函数模拟按下组合键,可以通过keyDown()函数和keyUp()函数模拟按下和释放单个按键。
下方代码演示了如何使用PyAutoGUI库控制键盘的输入和按键操作,以及如何模拟按下组合键。

import pyautogui

# 输入字符串"hello, world!",每个字符间隔0.1秒
pyautogui.typewrite("hello, world!", interval=0.1)

# 模拟按下组合键ctrl+c,然后释放
pyautogui.hotkey('ctrl', 'c')

# 按下和释放单个按键a
pyautogui.keyDown('a')
pyautogui.keyUp('a')

# 模拟按下组合键alt+tab,然后释放
pyautogui.hotkey('alt', 'tab')

# 模拟按下F1键,然后释放
pyautogui.press('F1')

屏幕截图

PyAutoGUI库提供了屏幕截图功能,可以通过screenshot()函数获取全屏截图,也可以通过region()函数获取指定区域的截图。获取的截图可以通过imageio库进行保存,也可以通过Pillow库进行处理。
下方代码演示了如何使用PyAutoGUI库进行屏幕截图,并使用imageio库和Pillow库进行保存和处理。
PS:所谓"库"指的是Python中的库(英文名为module或library),即一些预先编写好的代码集合,可以被其他程序引用和调用。例如,PyAutoGUI库、imageio库和Pillow库等都是Python中的库。

import pyautogui
import imageio
from PIL import Image

# 获取全屏截图并保存
im = pyautogui.screenshot()
im.save('screenshot.png')

# 获取指定区域截图并保存
im2 = pyautogui.screenshot(region=(0, 0, 100, 100))
im2.save('screenshot2.png')

# 获取指定区域截图并处理
im3 = pyautogui.screenshot(region=(0, 0, 100, 100))
im3_gray = Image.fromarray(im3.convert('L'))
im3_gray.show()

# 获取指定区域截图并保存为gif动画
with imageio.get_writer('screenshot.gif', mode='I') as writer:
    for i in range(10):
        im4 = pyautogui.screenshot(region=(0, 0, 100, 100))
        writer.append_data(im4)

图片定位

在PyAutoGUI库中,可以使用locateCenterOnScreen()函数对屏幕上的指定图片进行定位。该函数可以指定查找范围,限制查找速度。函数的返回值是一个Point对象,可以直接传入moveTo()函数和click()函数等进行鼠标操作。
下方代码演示了如何使用locateCenterOnScreen()函数在屏幕上查找指定的图片,并进行鼠标操作。

import pyautogui

# 查找屏幕中心的图片并点击
loc = pyautogui.locateCenterOnScreen("icon_xx.png")
pyautogui.moveTo(loc, duration=0.5)
pyautogui.click(clicks=1)

# 查找指定区域内的图片并点击
sizex, sizey = pyautogui.size()
loc2 = pyautogui.locateCenterOnScreen("icon_xx.png", region=(0, 0, sizex/2, sizey/10))
pyautogui.moveTo(loc2, duration=0.5)
pyautogui.click(clicks=1)

窗口操作

在PyAutoGUI库中,可以使用以下函数实现窗口操作:
获取窗口句柄:
可以使用Windows API函数FindWindow()和FindWindowEx()获取窗口句柄,然后使用Windows API函数SetForegroundWindow()将窗口置于最前端。
放大缩小和关闭:
可以使用Windows API函数SendMessage()给窗口发送消息,实现放大缩小和关闭等操作。
下方代码演示了相应的操作。

import pyautogui

# 查找屏幕中心的图片并点击
import win32gui

# 获取窗口句柄
hwnd = win32gui.FindWindow(None, "窗口标题")
# 将窗口置于最前端
win32gui.SetForegroundWindow(hwnd)

import win32gui
import win32con

# 获取窗口句柄
hwnd = win32gui.FindWindow(None, "窗口标题")
# 发送放大消息
win32gui.SendMessage(hwnd, win32con.WM_SYSCOMMAND, win32con.SC_MAXIMIZE, 0)
# 发送缩小消息
win32gui.SendMessage(hwnd, win32con.WM_SYSCOMMAND, win32con.SC_MINIMIZE, 0)
# 发送关闭消息
win32gui.SendMessage(hwnd, win32con.WM_CLOSE, 0, 0)

消息对话框

PyAutoGUI库可以使用函数实现消息对话框的操作。具体函数如下:
alert(text='', title='', button='OK'):显示一个包含文本消息和OK按钮的对话框。
confirm(text='', title='', buttons=['OK', 'Cancel']):显示一个包含文本消息和自定义按钮的对话框,返回所点击的按钮名称。
prompt(text='', title='', default=''):显示一个包含文本消息和输入框的对话框,返回所输入的文本。
以上函数可以用于对消息对话框进行操作,例如显示消息、确认操作、输入文本等。

实例演示

自动登录

自动登录公司内网

import pyautogui
import time

# 打开浏览器并进入表单页面
pyautogui.hotkey('winleft', 'r')
pyautogui.hotkey('ctrl', 'a')
pyautogui.press('delete')
pyautogui.typewrite('chrome')
pyautogui.press('enter')
time.sleep(1)
pyautogui.typewrite('https://xx.xxxx.com')
pyautogui.press('enter')
pyautogui.press('enter')
time.sleep(5)
# 自动填写表单
pyautogui.press('tab')
pyautogui.typewrite('5XXXX3')
pyautogui.press('tab')
pyautogui.typewrite('qXXXX3')
pyautogui.press('enter')
pyautogui.press('tab')
pyautogui.press('tab')

# 提交表单
# pyautogui.press('tab')
pyautogui.press('enter')

自动发送邮件

自动发送测试邮件

import pyautogui
import time
import pyperclip

pyautogui.hotkey('winleft', 'r')
pyautogui.hotkey('ctrl', 'a')
pyautogui.press('delete')
pyautogui.typewrite('C:\Program Files\greemail\CMClient')
pyautogui.press('enter')
time.sleep(1)
pyautogui.press('enter')
time.sleep(1)
write_button_loc = pyautogui.locateCenterOnScreen('write.png')
pyautogui.click(write_button_loc)
time.sleep(2)    

pyautogui.typewrite('5XXXX3')
time.sleep(2)    
pyautogui.press('enter')
pyautogui.press('tab')
pyautogui.press('tab')
time.sleep(1) 
pyperclip.copy('你好,世界!')
pyautogui.hotkey('ctrl', 'v')
time.sleep(1) 
pyautogui.hotkey('ctrl', 'enter')

注意事项

  • 建议使用time.sleep暂停。
  • 启用自动防故障功能。
  • 通过pyautogui.size()获取屏幕尺寸。
  • 使用pyautogui.position()获取鼠标位置。
  • 使用pyautogui.moveTo()和pyautogui.moveRel()控制鼠标移动。
  • 使用pyautogui.dragTo()和pyautogui.dragRel()拖拽鼠标。
  • 使用pyautogui.click()、pyautogui.doubleClick()和pyautogui.tripleClick()控制鼠标点击。
  • 使用pyautogui.mouseDown()和pyautogui.mouseUp()控制鼠标按下和松开。
  • 使用pyautogui.scroll()控制鼠标滚动。
  • PyAutoGUI提供30种缓动/渐变函数。
  • 可以通过getpixel()获取鼠标所在屏幕点的RGB颜色。

OneMoreThing

公司内部环境配置

略过

虚拟环境配置

  • 虚拟环境是一个独立的Python运行环境,它可以在同一台机器上创建多个独立的Python环境,每个虚拟环境之间是互相隔离的。在虚拟环境中安装的Python库和依赖不会影响到其他虚拟环境和全局环境,使得Python项目的依赖管理更加方便。
  • 在Python中,在Windows环境中,可以使用python -m venv env创建虚拟环境,其中evn为自定义的环境名称。创建完成后,可以使用以下命令进入虚拟环境:.\env\Scripts\activate。进入虚拟环境后,可以使用pip安装需要的Python库和依赖,例如:pip install requests。退出虚拟环境可以使用以下命令:deactivate。
  • Python虚拟环境的启用能够解决项目之间依赖冲突的问题,同时也方便了不同项目的管理。例如,在项目A中需要使用requests库的版本1.0,而项目B中需要使用requests库的版本2.0,如果不使用虚拟环境,则只能全局安装一种版本的requests库,会导致其中一个项目无法正常运行。使用虚拟环境后,可以在项目A的虚拟环境中安装requests库的版本1.0,在项目B的虚拟环境中安装requests库的版本2.0,从而解决了依赖冲突的问题。
    总之,Python虚拟环境的配置、进入、退出、启用是Python项目依赖管理的重要手段,能够解决项目之间依赖冲突的问题,同时也方便了不同项目的管理。通过虚拟环境,可以在同一台机器上创建多个独立的Python环境,每个虚拟环境之间是互相隔离的,使得Python项目的依赖管理更加方便。

一些可能需要的Python基础知识及学习渠道

在使用pyautogui前需要掌握的基础Python知识有:
Python基础语法、变量、数据类型、条件语句、循环语句、函数、模块等基础知识。
了解Python中的GUI编程,如Tkinter、PyQt等,能够理解图形界面的基本概念和布局方式。
了解Python中的异常处理,能够处理脚本运行时可能出现的错误。
了解Python中的文件读写操作,能够读取和写入文件。
对于使用pyautogui进行图像识别时,需要掌握Python中的图像处理库,如Pillow、OpenCV等。当然除了pyautogui还有很多神奇的自动化库,比如类似功能的pywinauto,可以用于爬取网页数据的Selenium等,靠后续实际使用中进一步发掘了。
Python是一门易于学习的编程语言,具有良好的可读性和简洁的语法,非常适合初学者入门。Python的学习渠道包括官方文档、在线教程、书籍、视频课程等。官方文档详细介绍了Python的语法、内置函数、标准库等内容,是Python学习的必备资料。在线教程可以通过互联网免费获取,例如W3School、博客园等网站都提供Python的在线教程。书籍是学习Python的另一个好选择,有很多经典的Python入门书籍,例如《Python编程从入门到实践》、《流畅的Python》等。视频课程也是学习Python的重要途径,例如学习强国、网易公开课等app都提供Python的视频课程,可以根据自己的需求和喜好选择适合自己的学习渠道。

总结

在本节PC自动化入门课程中,我们学习了基于pyautogui的自动化实现方法,包括鼠标、键盘、屏幕截图等操作。但是,我们更重要的是学会了如何学习和掌握自动化的方法和技巧。
正如授人以鱼不如授人以渔一样,学习PC自动化不仅仅是学会某个具体的工具或技术,更重要的是学会如何思考和解决问题。学习自动化需要不断地思考和实践,探索自己的方法和技巧,才能更好地完成自己的任务。
因此,希望本节课程能够帮助大家打开自动化的大门,掌握自动化的基本方法和技巧,同时也希望大家能够在实践中不断地学习和探索,掌握更加高效、灵活的自动化方法,为自己的工作和生活带来更多的便利和效益。