告别手动点点点:用Python+pywinauto/pyautogui给Windows软件做个自动化小助手(保姆级教程)
告别手动点点点用Pythonpywinauto/pyautogui打造Windows自动化神器每天早晨9点财务部的张磊都要重复同样的操作打开ERP系统、登录账号、导出前一天的销售报表再用Excel整理格式最后邮件发送给部门主管。这套流程至少占用他30分钟而这样的机械性任务在企业中比比皆是。如果你也厌倦了当人肉机器人Python的pywinauto和pyautogui这对黄金组合能让你用代码解放双手。本文将手把手带你实现一个真实办公场景的自动化方案——自动登录企业微信并导出日报数据。1. 环境配置与工具准备工欲善其事必先利其器。在开始编写自动化脚本前需要搭建合适的开发环境。推荐使用Python 3.8版本这个版本在Windows平台具有最好的兼容性表现。必备工具包安装pip install pywinauto pyautogui openpyxl提示若安装速度慢可添加-i https://pypi.tuna.tsinghua.edu.cn/simple使用国内镜像源安装完成后强烈建议准备以下辅助工具Inspect.exeWindows SDK自带的UI元素查看器位于C:\Program Files (x86)\Windows Kits\10\bin\10.0.xxxxx.0\x64截图工具用于捕捉需要操作的界面元素延迟计时器测量每个操作步骤的合理等待时间验证安装是否成功import pywinauto import pyautogui print(pywinauto.__version__, pyautogui.__version__) # 应输出版本号2. 自动化核心原理与双模块协作理解pywinauto和pyautogui的分工是设计高效脚本的关键。这两个库各有所长功能pywinauto优势pyautogui优势窗口控制通过句柄精准操作窗口无差别屏幕坐标操作元素定位支持控件树遍历和属性匹配依赖图像识别和坐标定位执行效率直接调用Windows API响应快需要模拟真实操作稍慢适用场景标准Windows程序(如记事本、WPS)游戏、无控件接口的古老程序在实际项目中我通常采用混合策略优先使用pywinauto操作标准窗口控件对无法识别的元素改用pyautogui图像定位复杂流程中穿插sleep()保证操作稳定性# 典型混合使用示例 from pywinauto import Application import pyautogui import time app Application(backenduia).start(wechatwork.exe) main_win app.window(title企业微信) main_win[导出按钮].click() # pywinauto操作标准按钮 time.sleep(1) pyautogui.click(save_icon.png) # 图像识别点击保存图标3. 实战企业微信日报自动化系统让我们实现一个完整的日报处理流程包含以下功能自动登录企业微信导航至日报模块导出昨日数据使用Excel自动整理格式邮件发送结果3.1 自动登录流程实现首先创建应用连接注意企业微信这类现代应用需指定backenduiadef wechat_login(username, password): app Application(backenduia).start(rC:\Program Files\WXWork\WXWork.exe) login_win app.window(title企业微信) # 输入凭据 login_win[Edit1].set_text(username) # 用户名输入框 login_win[Edit2].set_text(password) # 密码输入框 # 处理可能的验证码 if login_win[验证码].exists(): captcha input(请输入验证码) login_win[Edit3].set_text(captcha) login_win[登录].click() return app注意实际控件名称需用Inspect工具查看不同版本可能不同3.2 日报导出与数据处理成功登录后操作界面元素导出数据def export_daily_report(app): main_win app.window(title企业微信) main_win[工作台].click() main_win[日报].click() # 切换到最新打开的日报窗口 report_win app.window(title_re.*日报.*) report_win[导出].click() # 处理文件保存对话框 save_dlg app.window(title另存为) save_dlg[文件名].set_text(daily_report.xlsx) save_dlg[保存].click() # 等待导出完成 while not os.path.exists(daily_report.xlsx): time.sleep(0.5)然后用openpyxl自动美化Exceldef format_excel_report(): from openpyxl import load_workbook from openpyxl.styles import Font, Alignment wb load_workbook(daily_report.xlsx) ws wb.active # 设置标题样式 for row in ws.iter_rows(max_row1): for cell in row: cell.font Font(boldTrue, colorFF0000) cell.alignment Alignment(horizontalcenter) # 自动调整列宽 for col in ws.columns: max_length max(len(str(cell.value)) for cell in col) ws.column_dimensions[col[0].column_letter].width max_length 2 wb.save(formatted_report.xlsx)4. 高级技巧与避坑指南在实际企业环境中你可能会遇到这些典型问题4.1 界面元素定位失败解决方案场景更新后按钮ID变化导致脚本失效应对策略使用模糊匹配定位元素# 通过部分标题匹配 app.window(title_contains导出)结合图像识别# 先定位大致区域再精确点击 export_pos pyautogui.locateOnScreen(export_btn.png) pyautogui.click(export_pos)4.2 多显示器环境适配在双屏办公场景中坐标系统会发生变化# 获取主显示器分辨率 primary_w, primary_h pyautogui.size() # 将操作限制在主显示器 pyautogui.moveTo(100, 100) # 始终相对于主显示器左上角4.3 异常处理与日志记录健壮的脚本需要完善的错误处理import logging logging.basicConfig(filenameautomation.log, levellogging.INFO) try: app Application().connect(title企业微信) except Exception as e: logging.error(f连接失败{str(e)}) # 尝试重启应用 os.system(taskkill /f /im WXWork.exe) app Application().start(rC:\Program Files\WXWork\WXWork.exe)5. 性能优化与扩展思路当自动化脚本需要处理大量操作时这些技巧能显著提升效率操作加速技巧禁用pyautogui的安全延迟pyautogui.PAUSE 0.1 # 每个操作后默认暂停0.1秒批量操作时使用pywinauto的wrapper_objectitems app.window(class_nameListView).items() for item in items[:10]: # 仅处理前10项 item.double_click()扩展应用场景结合Windows任务计划实现定时触发集成Outlook自动发送邮件添加异常监控自动报警功能在最近的一个客户案例中通过优化后的脚本将原本需要45分钟的人工操作缩短到3分钟自动完成准确率达到100%。关键在于充分测试每个步骤的稳定性并为可能的变化预留调整空间。