Python让繁琐工作自动化——chapter18 GUI控制键盘与鼠标

1. 基础语法

"GUI自动化":通过程序控制应用,向他们发送虚拟的击键和鼠标点击,即图形用户界面自动化

import pyautogui

#以下指令将返回屏幕分辨率大小
weight , height = pyautogui.size()

1.1 鼠标

(1)移动鼠标

#移动绝对坐标值(x,y,移动到该位置所需时间)
pyautogui.moveto(100,200,duration = 0.2)
#移动相对坐标
pyautogui.moveRel(100,-100,duration = 0.2)

(2)获取鼠标位置

#返回坐标元组
pyautogui.position()

(3)点击鼠标

#点击函数(x,y,点击左/右键)
pyautogui.click(x,y,button = 'left')
#鼠标按下不松开
pyautogui.mouseDown()
#释放鼠标
pyautogui.Up()
#双击左键
pyautogui.doubleClick()
#双击中键
pyautogui.middleClick()

(4)拖动鼠标

#拖动到绝对坐标位置
pyautogui.dragTo(x,y,duration = 0.2)
#拖动到相对坐标位置
pyautogui.dragRel(x,y,duration = 0.2)

(5)滚动鼠标

#正数为向上滚动,负数为向下滚动
pyautogui.scroll(100)

1.2 处理屏幕

(1)获取屏幕快照

#im包含一个Image对象,可对其调用Image方法
im = pyautogui.screenshot()
#传入坐标元组,返回该处RGB元组
im.getpixel((50,100))

(2)分析屏幕快照

可用于判断该处按钮是否为可选按钮,灰色按钮等

#参数(x,y,(R,G,B)),检查(x,y)处RGB是否完全匹配给出的RGB元组值,返回True/False
pyautogui.pixelMatchesColor(20,300,(255,255,0))

(3)图像识别

将以前保存的屏幕快照保存为‘submit.png’

#函数返回四个证书的元组,是屏幕上首次发现该图像时左边的X坐标,顶边的Y坐标,图像的宽度以及高度
pyautogui.locateOnScreen('submit.png')    #这里要求的是“完全匹配”

若该图像能在屏幕上找到多处,则 pyautogui.locateAllOnScreen() 函数将返回一个Generator对象,将他传递给List,返回一个4整数元组的列表。

1.3 键盘

(1)键盘发送字符串

#在此之前一般会先调用click函数取得焦点
pyautogui.typewrite('hello world')

(2)键名

PyKeyboard属性
键盘键字符串  含义
‘a’,'1','?'等

 单个字符的键

‘enter’ / '\n'  回车键
‘esc’  Esc键
shiftleft , shiftright  左右shift键
altleft, altright  左右alt键
ctrlleft同上  左右ctrl
tab  \t  Tab键
backapace delete  空格键 Del键
pageup pagedown  Page UP/Down
home   end  Home End
up down left right  上下左右箭头键
f1 f2...  F1-F12
volumemute  volumedown volumeup  音量静音,调大,调小
pause  Pause
capslpck numlock scrolllock  功能锁
insert  同义
printscreen  同义
winleft winright  左右win键
command  Command键(OS)
option option键(OS)

注:以上调用时加上 ' '

(3)按下和释放键盘

#打印 % 符号 ‘shift+5’
pyautogui.keyDown('shift') #按下
pyautogui.press('4')     #按下并释放
pyautogui.keyUp('shift)   #释放

(4)热键组合

为了避免以上麻烦的指令,可应用热键功能,接受多个键字符串的函数,按给出的顺序按下,相反的顺序释放,于是以上代码就变成了:

pyautogui.hoykey('shift','4')

2. 实例应用

2.1 鼠标在哪里

在移动鼠标时随时显示x,y坐标,以及RGB颜色值

#@TIME :2018/4/5  16:24
#输出当前鼠标位置,以及像素RGB颜色
import pyautogui

print("Press Crtl+C to quit")
try:
    while True:
        x, y  = pyautogui.position()
        positionstr = 'X:  '+str(x).rjust(4) + 'Y:  ' + str(y).rjust(4)      #格式化输出

        pixelcolor = pyautogui.screenshot().getpixel((x,y))                  #截图得到x,y处颜色值
        positionstr += '  RGB :('+str(pixelcolor[0]).rjust(3)
        positionstr +=', ' + str(pixelcolor[1]).rjust(3)
        positionstr +=', ' + str(pixelcolor[2]).rjust(3) +' )'
        print(positionstr)
        # print('\b'*len(positionstr),end='',flush=True)                     #每移动一次屏幕刷新
except KeyboardInterrupt:      #捕捉中断异常
    print("Done\n")

2.2 自动提交表单

#@TIME :2018/4/8  15:18
#自动填表程序 网址:https://docs.google.com/forms/d/e/1FAIpQLScSVDFU76rZvbO_tiIwSt6d9sOK0CZyS9KKMCP6cP5O5W5lVQ/viewform

import pyautogui,time
# 0 要输入的信息(以列表中元组的形式)
FormData = [
    {'name':'Alex','fear':'eavesdroppers','source':'money','robocop':4,'comments':'Tell bob i said hi'},
    {'name':'Bob','fear':'bees','source':'wand','robocop':3,'comments':'n/a'}
]
# 1 找到各按钮的确切位置(通过上一个例子确定按钮位置)
namefield = (369,333)
submit= (400,524)
submitcolor = (156, 141, 248)
submitanother = (517,245)
#2 开始键入数据
for person in FormData:
    print(">>>5s pause to let users press crtl-c")     #给5秒的时间确定屏幕焦点
    time.sleep(5)

    # while not pyautogui.pixelMatchesColor(submitcolor[0],submitcolor[1],submitcolor[2]):
    #     time.sleep(0.5)
    print("Entering %s info..."%(person['name']))
    pyautogui.click(namefield[0],namefield[1])
    pyautogui.typewrite(person['name'] + '\t')     #'\t'进行下一项的填写
    pyautogui.typewrite(person['fear']+'\t')
# 3 处理列表和单选按钮
    if person['source'] == 'wand':      #下拉菜单
        pyautogui.typewrite(['down','\t'])
    elif person['source'] == 'money':
        pyautogui.typewrite(['down','down','down','down','\t'])

    if person['robocop'] == 3:     #单选按钮
        pyautogui.typewrite(['right','right','\t'])
    elif person['robocop'] == 4:
        pyautogui.typewrite(['right','right','right','\t'])

    pyautogui.typewrite(person['comments'] +'\t')
    pyautogui.typewrite('enter')   #提交
# 4 开始另一份
    print("Submit clicked")
    pyautogui.click(submitanother[0],submitanother[1])  #开始另一个

3. 课后习题

18.14.1 看起来很忙机器人

#@TIME :2018/4/8  16:02
#不想通信软件变为空闲,每隔十秒钟动一下鼠标
import pyautogui,time

TIMESLEEP = 5
try:
    while True:
        x,y = pyautogui.position()
        print(x,y)

        time.sleep(TIMESLEEP)
        pyautogui.moveRel(10,0,duration=0.2)
except KeyboardInterrupt:
    quit()

你可能感兴趣的:(Python学习)