我心中的王者:Python-用Python控制鼠标、屏幕与键盘
本章主要说明使用Python控制鼠标、屏幕与键盘的应用。为了执行本章的程序,请安装pyaotogui模块。
pip install pyautogui
28-1 鼠标的控制
28-1-1 提醒事项
由于这一章将讲解鼠标的控制,用户可能会因为程序设计错误造成对鼠标失去控制,造成程序无法控制,甚至无法使用鼠标结束程序,最后可能需使用下列方式结束计算机。
方法1:
Windows:同时按Ctrl + Alt +Del。
Mac OS:同时按Command + Shift + Option + Q。
方法2:
或是在设计程序时,每次启用pyautogui的方法设定暂停3秒再执行。
这时快速处理移动鼠标关闭程序。
方法3:
也可以使用下列语法先设定Python的安全防护功能失效。
首先在暂停3秒钟期间,你可以快速将鼠标光标移至屏幕左上角,这时会产生pyautogui.FailSageException异常,可以设计让程序终止。
28-1-2 屏幕坐标
我们操作鼠标时可以看到鼠标光标在屏幕上移动,对鼠标而言,屏幕坐标的基准点(0,0)位置在左上角,往右移动x轴坐标会增加,往左移动x轴坐标会减少。往下移动y轴坐标会增加,往上移动y轴坐标会减少。
坐标的单位是Pixel(像素),每一台计算机的像素可能不同,可以用size( )方法获得计算机屏幕的像素,这个方法传回2个值,分别是屏幕宽度和高度。
程序实例ch28_1.py:列出目前使用计算机的像素。
# ch28_1.py
import pyautogui
width, height = pyautogui.size() # 设定屏幕宽度和高度
print(width, height) # 打印屏幕宽度和高度
执行结果
2560 1600
由上图笔者可以得到目前所用计算机屏幕像素规格。
28-1-3 获得鼠标光标位置
在pyautogui模块内有position( )方法可以获得鼠标光标位置,这个方法会传回2个值,分别是鼠标光标的x轴和y轴坐标。
程序实例ch28_2.py:获得鼠标光标位置。
# ch28_2.py
import pyautogui
xloc, yloc = pyautogui.position() # 获得鼠标光标位置
print(xloc, yloc) # 打印鼠标光标位置
执行结果
1396 940
程序实例ch28_3.py:这个程序会持续打印鼠标光标位置,直到鼠标光标x轴位置到达1800(含)以上才停止。
ch28_3.py
import pyautogui
xloc = 0
while xloc < 1800:
xloc, yloc = pyautogui.position() # 获得鼠标光标位置
print(xloc, yloc) # 打印鼠标光标位置
执行结果 下列是部分画面。
1795 824
1795 824
1795 824
1801 824
28-1-4 绝对位置移动鼠标
在pyautogui模块内有moveTo( )方法可以将鼠标移至光标设定位置,它的使用格式如下。
moveTo(x坐标, y坐标, duration=xx) # xx是移动至此坐标的时间
程序实例ch28_4.py:控制光标在一个矩形区间移动,下列程序duration是设定光标移动至此坐标的时间,我们可以自行设定此时间。可以得到鼠标光标在左上角(300,300)、右上角(1500, 300)、右下角(1500, 700)和左下角(300, 700)间移动5次。
# ch28_4.py
import pyautogui
x, y = 300, 300
for i in range(5):
pyautogui.moveTo(x, y, duration=0.5) # 左上角
pyautogui.moveTo(x+1200, y, duration=0.5) # 右上角
pyautogui.moveTo(x+1200, y+400, duration=0.5) # 右下角
pyautogui.moveTo(x, y+400, duration=0.5) # 左下角
执行结果
鼠标自动移动
28-1-5 相对位置移动鼠标
在pyautogui模块内有moveRel( )方法可以将鼠标移至相较于前一次光标的相对位置,一般是适用在移动距离较短的情况,它的使用格式如下。
moveRel(x位移, y位移, duration=xx) # xx是移动至此坐标相对位置的时间
程序实例ch28_5.py:控制光标在一个正方形区间移动,程序执行会以光标位置为左上角,然后在正方形区间移动。程序执行期间,你将发现我们无法自主控制鼠标光标。
# ch28_5.py
import pyautogui
for i in range(5):
pyautogui.moveRel(300, 0, duration=0.5) # 往右上角移动
pyautogui.moveRel(0, 300, duration=0.5) # 往右下角移动
pyautogui.moveRel(-300, 0, duration=0.5) # 往左下角移动
pyautogui.moveRel(0, -300, duration=0.5) # 往左上角移动
执行结果 本程序执行结果与ch28_4.py相同。
28-1-6 键盘Ctrl-C键
如果我们现在执行ch28_3.py,可以发现除了鼠标光标在x轴超出1000像素坐标可以终止程序外,如果按下Ctrl-C键,也可以产生KeyboardInterrupt异常,造成程序终止。
了解了上述特性,我们可以改良ch28_3.py。
程序实例ch28_6.py:重新设计ch28_3.py,增加若是读者按键盘的Ctrl-C键,也可以让程序终止执行,当然要设计这类程序需借用异常处理。这个程序如果是异常结束将跳一行输出Bye字符串。
# ch28_6.py
import pyautogui
xloc = 0
print('按Ctrl-C 可以中断本程序')
try:
while xloc < 1000:
xloc, yloc = pyautogui.position() # 获得鼠标光标位置
print(xloc, yloc) # 打印鼠标光标位置
except KeyboardInterrupt:
print('\nBye')
执行结果
按Ctrl-C 可以中断本程序
2339 121