Python实现计算机的自动化控制!

Python 专栏收录该内容
150 篇文章 1 订阅

 

懒惰,让一切成为可能!


一提到自动化,想必很多人都有需求。对于一些重复的,批量的工作,我们总是感到头疼。这种时候,就不如把工作交给计算机来做了。电脑虽然很蠢,没有人的逻辑思维,你需要明确告诉它每一步需要执行的东西,但是电脑有一个人永远无法超过的优点,就是在保证正确率的情况下,以飞快的速度解决问题。简单来说就是,你让他往东,他绝不往西而且反应很快。下面我们就用python的pyautogui模块实现一些基本的自动化控制。 ————————————————————————————————————————

〇、安装pyautogui模块 这很简单,在安装完python的计算机上,打开终端或命令提示符,输入pip install pyautogui 即可

一、控制鼠标

  1. position()方法

要想控制鼠标,最基本的要求是我们应该能找到鼠标现在所处的坐标 ·····我们要用到position()方法,代码和运行效果如下。

 
 

import pyautogui #调用pyautogui模块 x,y=pyautogui.position() #获取鼠标光标位置 print(x,y) #将坐标值输出在屏幕上

 

———————————————————————————————————————

  1. moveTo() 和 moveRel()方法 ·······当然,只知道鼠标在什么地方还是不够的,我们还要知道如何移动鼠标,不过在此之前,我们先来看一点东西。这个标题明显的告诉我们,这都是两个方法(函数)。那它们有什么区别呢? ·······首先,我们要了解我们给电脑屏幕建立的坐标系。我们取屏幕的左上角为原点,如下图,横向为X轴,纵向为Y轴。

·······那好,假如你想让鼠标移动到一个点,这很简单,你直接输入需要移动到的坐标点就行。但是如果有这么一种情况,你需要把鼠标向右移动100个单位,然而你并不知道向右移动100个单位后光标会落在哪里,只是移动100个单位而已,那又该如何解决呢? ·······这就涉及到了绝对坐标和相对坐标的区别。 第一个函数pyautogui.moveTo()是将鼠标移动到一个绝对的坐标点上,代码如下:

 
 

import pyautogui #调用pyautogui库 pyautogui.moveTo(100,100,1) #将鼠标用一秒时间移动到(100,100)这个坐标点上

·······第二个函数pyautogui.moveRel()是将光标移动一段距离,代码如下:

 
 

import pyautogui #调用pyautogui库 pyautogui.moveRel(100,100,1) #将光标沿右下移动,其在X,Y两轴方向上的分量均为100,共用1秒时间 pyautogui.moveRel(-100,-100,1) #将光标沿左上方移动,其余同上

另外,pyautogui.move() 和 pyautogui.moveRel() 效果是相同的 ——————————————————————————————————————— 3. click() 方法 ·······要想真正实现自动化控制,只知道鼠标在哪里和如何移动鼠标是远远不够的,我们必须知道怎么点击鼠标。这就用到了click()方法。 这个方法可以传进去三个参数,即 pyautogui.click(x,y,button) 。x,y是需要点击的坐标,button是需要点击的按键。它有三个取值,分别是‘left’(左键),‘right’(右键),‘middle’(滑轮)如果你不告诉程序 x 和 y ,而只让它去点击,那么程序会在当前鼠标所在的位置点击鼠标。示例代码如下:

 
 

import pyautogui #调用pyautogui库 pyautogui.click(100,100,button='left') #用鼠标左键点击坐标点(100,100)

当然,click() 这个方法只能单击鼠标,并且你每次点击鼠标都要设置用哪一个键,这就比较麻烦,所以click() 方法被二次封装,形成了以下一些常用方法: ① pyautogui.doubleClick(100,100,button=‘right’) //右键双击鼠标。 ② pyautogui.rightClick(x,y) //右键单击鼠标 ③pyautogui.middleClick(x,y)//单机中间(滑轮) 注:一次鼠标点击事件其实是由两个子方法mouseDown() 和 mouseUp()还有moveTo()等封装形成的。

———————————————————————————————————————

4.dragTo() 和 dragRel()方法 有时候我们需要对一个窗口进行拖拽,或者画一个对角矩形,这时候dragTo() 和 dragRel()是不错的选择。 ·······这两个方法可以类比前面的moveTo() 和 moveRel() 使用,用法完全一样,但是时间一定不要设置的太短,否则程序可能会崩溃或错乱。

———————————————————————————————————————

5.scroll()方法 ·······对于鼠标的操作基本上功能都有了,但我们还少一个最基本的操作,就是滚滑轮。 滚滑轮我们需要用到pyautogui.scroll()这个方法。这个方法只接受一个参数,就是向上或者向下滚动,正值屏幕向下滚动(相当于向上滚滑轮),负值屏幕向上滚动(相当于向下滚滑轮)。实例代码如下:

 
 

import pyautogui#调用pyautogui库 pyautogui.scroll(-500)#向上卷动屏幕500单位,话说这单位到底是什么我还真没有仔细研究过,用的时候再说吧

最后,需要注意的是,如果我们点击鼠标,或者拖拽,滚动等操作太快的话,电脑可能处理不好,造成程序瘫痪,所以我们在调用了库之后,可以紧跟着在下一行打上pyautogui.PAUSE = 1。 这一行的作用是每一个pyautogui操作中间间隔1秒时间。其间隔可以自行设定,单位是秒。 到这里,所有鼠标操作已基本可以完成。

——————————————————————————————————————— ·····················································································································———————————————————————————————————————

二、控制键盘

  1. keyDown() 和 keyUp()方法 ·······要想控制键盘,我们还是得从简单的开始,最简单的莫过于按下/松开一个键了 我们用keyDown()方法来按下一个键,用keyUp()方法来松开一个键。这两个函数都可以传入键名。示例代码如下:

 
 

import pyautogui pyautogui.keyDown('A') #按下键盘上的‘A’ pyautogui.keyUp('A') #松开'A' pyautogui.keyDown('a') #按下键盘上的‘a’ pyautogui.keyUp('a') #松开'a' pyautogui.keyDown('enter') #按下键盘上的‘enter’回车键 pyautogui.keyUp('enter') #松开'enter'回车键

———————————————————————————————————————

2.press()方法 通过前两个方法,其实我们已经可以去操作键盘了,但是我们会感觉这样按下松开的,特别麻烦,所以我们就将他们封装成了press()方法。这个方法表示把某个键按一下(即按下之后松开)。这个呢就像是之前介绍鼠标操作的时候,我们提了一下,click()函数是由mouseDown() 和 moseUp()等进行的二次封装。示例如下:

 
 

import pyautogui pyautogui.press('4') #按一下键盘上的‘4’ pyautogui.press('shift')#按一下shift键

———————————————————————————————————————

3.hotkey()方法 还有一些情况下,我们需要同时按下多个键,看到这个方法的名字就知道这是热键而已 hotkey()接受一个字符串列表,其中,每一个元素都是一个数据键名。实列程序如下:

 
 

import pyautogui pyautogui.hotkey('ctrl','c')#同时按下‘CTRL’和‘C’(复制快捷键)

——————————————————————————————————————— 4.typewrite()方法 我们为了更简单的实现想文本框输入字符串的操作,这个方法真是必不可少。typewrite()方法接收两个参数,str 和 delay,即 typewrite(str,delay) 。str是要向文本框中输入的字符串,delay是每一个字符之间的时间间隔。其用法如下:

 
 

import pyautogui pyautogui.typewrite('1234567890',1)#向文本框输入1234567890,每个字符间隔1秒,共用10秒

以下是在使用pyautogui的键盘操作时可以输入的数据键名: 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’] 至此,关于键盘的一切操作基本上都可以完成了。 ——————————————————————————————————————— ····················································································································· ——————————————————————————————————————— 整体来讲,我们到这里已经可以实现一些自动化操作了,不过我们很快就发现,还有一个非常不方便的问题,阻止了我们迈向全自动的脚步。如果你要用鼠标点击一个图标(比如QQ),首先你得历尽艰辛找到QQ图标的位置,然后你才能点的准。当你千辛万苦的设置完之后,你发现你QQ的图标被人移动了位置,你又忘记了具体在什么地方。。。。┗|`O′|┛ 嗷~~这可如何是好?于是我们就想:如果能让程序自己找到QQ,那该有多好啊。莫急,下面我们来了解一下pyautogui模块中的屏幕操作,来赋予你的程序识别屏幕的能力,实现真正的自动化。(其实我主要是想写一个游戏脚本,有了这个真的是上能挂机刷宝箱,下能自动写文档。拳打南山敬老院,脚踢北海幼儿园。噢,扯远了·······) ——————————————————————————————————————— ····················································································································· ———————————————————————————————————————

三、识别屏幕 这个板块我们那一个实例来说,我们的目的是将一个图标不管放到屏幕上的什么位置,都要自动化的找到并点击它。下面走一个详细流程。

  1. 首先我们要截取一张png格式的图片,这个图片就是我们要到屏幕中对比点击的图标,如下图所示:

图中我创建了一个hehe.png的图片。然后我们就以这个图片为目标图像,在其他图片中寻找到和这个图片相同的部分,并输出此部分的坐标。事先说一下,我的电脑桌面是E盘,因为有桌面管理工具,所以桌面可以翻页,代码如下:

 
 

import pyautogui x,y=pyautogui.locateCenterOnScreen('E:/hehe.png') print(x,y)

执行效果如下,可以看到,桌面上有一个qq.ico的图标文件,我在终端执行了代码后,程序输出的返回值就是qq.ico图标在桌面上的位置。

 

如果我用终端的窗口将qq.ico图标遮住呢?那么就变成了下图的情况,可见由于程序未在当前屏幕中找到相同的图标而异常出错。

那么想必大家对 locateCenterOnScreen() 这个方法的作用应该很明了了b吧。没``它就是现将当前屏幕截图,再于截的图中找出和你预设的目标图一样的部分,最后再返回这个部分的中点坐标而已。然后有了目标的位置,再加上之前鼠标和键盘的操作,不就行了吗?实话说,确实差不多了,但还有好多方便的方法我们需要了解一下:

①a = pyautogui.screenshot(r’C:\Users\ZDH\Desktop\PY\my_screenshot.png’) #截全屏,并且设置保存路径。

②a = pyautogui.screenshot(r’C:\Users\ZDH\Desktop\PY\region_screenshot.png’, region=(0, 0, 300, 400))#根据region给的范围截取区域屏幕

③x, y = pyautogui.center(a) # 获得文件图片在现在的屏幕上面的中心坐标

④pyautogui.locateAllOnScreen(r’C:\Users\ZDH\Desktop\PY\region_screenshot.png’) for pos in pyautogui.locateAllOnScreen(r’C:\Users\ZDH\Desktop\PY\region_screenshot.png’): ···print(pos)#匹配图中所有与目标图像,返回列表,可用循环打印坐标。

⑤pix = pyautogui.screenshot().getpixel((220, 200)) # 获取坐标(220,200)所在屏幕点的RGB颜色

⑥pyautogui.pixelMatchesColor(100, 200, (255, 255, 255))#检查(100,200)的rgb是否为(255,255,255)返回布尔值。

那么到这里就要结束了,一切问题的答案,取之于互联网,反馈与互联网。PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

python免费学习资料以及群交流解答点击即可加入

  • 6
    点赞
  • 0
    评论
  • 23
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页

打赏作者

pythonlaodi

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值