这是Python小软件系列文章,关注猿人学的老朋友知道我写的Python文章可归纳为:Python爬虫挣钱系列、Python爬虫小偏方系列、Python异步IO系列、Python小软件系列等,我在这些系列中交替着写,今天写一个截屏的小应用。


1.截屏应用功能拆解

先把要实现哪些功能罗列一下,功能拆解好了,程序设计时就比较清晰。


1).首先要能响应快捷键调起截屏程序,像QQ使用Ctrl+shift+B可以截屏一样;


2).然后就是截图功能,可以用鼠标选取截取的区域;


3).最后是要把截屏保存为本地图片。


2.做一下技术调研

功能拆解出来了,就开始调查下实现难度,有没有现成的第三方库可用,Python是出了名的库多,多找一找总会找到的。


搜寻了一下Python有截图功能的库,基本都是全屏截图和程序输入坐标来区域截图,没办法用鼠标选择可视化截图。不过网上有同学提出通过写一个GUI程序,把全屏截图展示在这个GUI界面上,然后在GUI上可以实现鼠标可视化选取功能。


看起来还不错,因为之前用过Tkinter,所以就用Tkinter来做GUI了,不过很久没写,手也生得很。


Tkinkter可以监听键盘事件,但是只有当焦点在Tkinter上时才会响应键盘事件,而截图应用是截其他地方的图,比如浏览器,聊天软件等等,焦点这时肯定不在Tkinter上,所以需要另找一个可以全局监听键盘事件的库,pynput就进入了法眼。


跟截图图片处理的话,首先就想到PIL库,它的ImageGrab方法能够全局截图,也能传入坐标实现区域截图,就选PIL了。


一番搜寻下来确定了实现方法:

使用pynput库来监听键盘,使用Tkinter来做GUI,使用PIL的ImageGrab来截图。


详细的实现原理是:

当程序运行起来后就在后台监听键盘,当键盘按下ctrl+shift+M时就使用PIL做全屏截图,接着用Tkinter把全屏截图显示出来,通过Tkinter的画布(canvas)和鼠标选取做二次截图。


3.开始码砖了

pynput、Tkinter、PIL官方和网上都有示例,拿过来改一改,把他们逻辑串在一起就可以调试了。(我只是大自然的搬运工)


监听键盘代码如下:


用Python写一个像QQ可快捷键唤起区域截屏的应用_java


截图、调用TK、二次截图主逻辑如下:

用Python写一个像QQ可快捷键唤起区域截屏的应用_java_02

想加一个演示效果的,结果录屏软件弄了很久,视频分辨率都不理想,汗!


100多行代码搞定快捷键截屏功能,这就是用Python的好处,各种小功能都有解决方案,主要花的事情是拆解功能,选定实现路径。


不过这样由于是做了两次截图,第一次全屏截图,第二次是在全屏截图上再截图,所以保存下来的图片不太清晰。