如何使用python写截屏小工具


Posted in Python onSeptember 29, 2020

前言

今天我看了一下自己的文件夹,发现了自己写了许多似乎很无聊的代码。于是乎,一个想法油然而生:“生活已经很无聊了,不如再无聊一点叭”。
说干就干,那就开一个专题,我们称之为kimol君的无聊小发明。
妙…啊~~~

今天要做的东西,就是用python写一个截屏工具。想必大家平时截屏的时候很多都是用的微信的ALT+A或者是WINDOWS自带的截屏软件。作为技术宅的我,怎么总是用别人的东西呢?
看我的,上图:

如何使用python写截屏小工具

效果还阔以,好歹这个小猫咪截出来也是有模有样的~

一、技术实现

1. 相关库

在python中可以实现截图的库有很多,这里我用的是pyautogui,它可以对指定区域进行截屏:

import pyautogui

而界面部分(截屏的框选等)采用了tkinter库:

2. 定义窗口

定义一个透明的窗口,让它的大小与屏幕一样:

root = tk.Tk()
root.overrideredirect(True)  # 隐藏窗口的标题栏
root.attributes("-alpha", 0.1) # 窗口透明度10%
root.geometry("{0}x{1}+0+0".format(root.winfo_screenwidth(), root.winfo_screenheight()))
root.configure(bg="black")
注:alhpa参数用于设定透明度;geometry函数用于设定窗口大小;
创建一个子窗口,用于显示框选区域:

# 再创建1个Canvas用于圈选
cv = tk.Canvas(root)
x, y = 0, 0
xstart,ystart = 0 ,0
xend,yend = 0, 0
rec = ''

注:alhpa参数用于设定透明度;geometry函数用于设定窗口大小;
创建一个子窗口,用于显示框选区域:

# 再创建1个Canvas用于圈选
cv = tk.Canvas(root)
x, y = 0, 0
xstart,ystart = 0 ,0
xend,yend = 0, 0
rec = ''

3. 绘制工具条

绘制一个工具条,方便后续增加功能。讲道理目前来说这个就是个鸡肋(可以省去),但是如果后续还想晚上功能的话,会很有帮助。

canvas = tk.Canvas(root)
canvas.configure(width=300)
canvas.configure(height=100)
canvas.configure(bg="yellow")
canvas.configure(highlightthickness=0) # 高亮厚度
canvas.place(x=(root.winfo_screenwidth()-500),y=(root.winfo_screenheight()-300))
canvas.create_text(150, 50,font='Arial -20 bold',text='ESC退出,假装工具条')
1234567

4. 定义事件函数

监听鼠标和键盘事件,实时监控框选区域和截屏,具体的事件有:

# 绑定事件
canvas.bind("<B1-Motion>", move) # 鼠标左键移动->显示当前光标位置
root.bind('<Escape>',sys_out) # 键盘Esc键->退出
root.bind("<Button-1>", button_1) # 鼠标左键点击->显示子窗口 
root.bind("<B1-Motion>", b1_Motion)# 鼠标左键移动->改变子窗口大小
root.bind("<ButtonRelease-1>", buttonRelease_1) # 鼠标左键释放->记录最后光标的位置
root.bind("<Button-3>",button_3) #鼠标右键点击->截屏并保存图片
root.mainloop()

监听鼠标光标位置:

def move(event):
 global x, y ,xstart,ystart
 new_x = (event.x-x)+canvas.winfo_x()
 new_y = (event.y-y)+canvas.winfo_y()
 s = "300x200+" + str(new_x)+"+" + str(new_y) 
 canvas.place(x = new_x - xstart,y = new_y -ystart) 
 print("s = ", s)
 print(root.winfo_x(), root.winfo_y())
 print(event.x, event.y)

创建子窗口:

def button_1(event):
 global x, y ,xstart,ystart
 global rec
 x, y = event.x, event.y
 xstart,ystart = event.x, event.y
 print("event.x, event.y = ", event.x, event.y)
 xstart,ystart = event.x, event.y 
 cv.configure(height=1)
 cv.configure(width=1)
 cv.config(highlightthickness=0) # 无边框
 cv.place(x=event.x, y=event.y)
 rec = cv.create_rectangle(0,0,0,0,outline='red',width=8,dash=(4, 4))

改变子窗口大小:

def b1_Motion(event):
 global x, y,xstart,ystart
 x, y = event.x, event.y
 print("event.x, event.y = ", event.x, event.y)
 cv.configure(height = event.y - ystart)
 cv.configure(width = event.x - xstart)
 cv.coords(rec,0,0,event.x-xstart,event.y-ystart)

松开鼠标,记录最后的光标位置:

def buttonRelease_1(event):
 global xend,yend
 xend, yend = event.x, event.y

截屏并保存图片:

def button_3(event):
 global xstart,ystart,xend,yend
 cv.delete(rec)
 cv.place_forget()
 img = pyautogui.screenshot(region=[xstart,ystart,xend-xstart,yend-ystart]) # x,y,w,h
 img.save('screenshot.png')
 sys_out(None)

退出程序:

def sys_out(even):
 root.destroy()

二、后续改进

这个还有很多可以改进的地方。

  • 截图的时候会有dos窗口遮挡:这个解决办法由很多,类似后台启动,或者将.py编译为可执行文件等等;
  • 使用不方便,为了截图还的运行代码:废话!!!当然很不方便呀,不然怎么说是个无聊的小发明呢。但是!!!它也不是一无事处,可以考虑把它放到后台运行。同样可以利用快捷键来唤醒它并完成截图。
  • 功能单一:这只是一个很简单的demo,既然可以截屏了,那么我们离录屏还远吗?(正如本文开头的动图,右上角晃晃几个大字“ApowerREC”,不给钱休想去掉,哼~)那么,我们为何不自己写一个呢?

写在最后

最后,感谢各位大大的耐心阅读~

到此这篇关于如何使用python写截屏小工具的文章就介绍到这了,更多相关python截屏小工具内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python的Django框架中forms表单类的使用方法详解
Jun 21 Python
django 修改server端口号的方法
May 14 Python
Tensorflow中使用tfrecord方式读取数据的方法
Jun 19 Python
python爬虫租房信息在地图上显示的方法
May 13 Python
Apache,wsgi,django 程序部署配置方法详解
Jul 01 Python
TensorFlow实现保存训练模型为pd文件并恢复
Feb 06 Python
Python 爬取必应壁纸的实例讲解
Feb 24 Python
Python使用monkey.patch_all()解决协程阻塞问题
Apr 15 Python
python读取图片颜色值并生成excel像素画的方法实例
Feb 19 Python
如何在pycharm中快捷安装pip命令(如pygame)
May 31 Python
python实现简单聊天功能
Jul 07 Python
python实现双向链表原理
May 25 Python
python如何调用百度识图api
Sep 29 #Python
Python 串口通信的实现
Sep 29 #Python
使用py-spy解决scrapy卡死的问题方法
Sep 29 #Python
详解python对象之间的交互
Sep 29 #Python
python PIL模块的基本使用
Sep 29 #Python
Python 如何实现数据库表结构同步
Sep 29 #Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
Sep 29 #Python
You might like
php数据访问之查询关键字
2016/05/09 PHP
PHP实现微信小程序人脸识别刷脸登录功能
2018/05/24 PHP
PHP pthreads v3使用中的一些坑和注意点分析
2020/02/21 PHP
jQuery实现数字加减效果汇总
2014/12/16 Javascript
javascript算法题:求任意一个1-9位不重复的N位数在该组合中的大小排列序号
2015/04/01 Javascript
JavaScript获取网页表单action属性的方法
2015/04/02 Javascript
JavaScript中string对象
2015/06/12 Javascript
图解JavaScript中的this关键字
2020/05/28 Javascript
javascript实现瀑布流加载图片原理
2016/02/02 Javascript
详解Sea.js中Module.exports和exports的区别
2017/02/12 Javascript
详解在Angularjs中ui-sref和$state.go如何传递参数
2017/04/24 Javascript
jQuery实现在HTML文档加载完毕后自动执行某个事件的方法
2017/05/08 jQuery
使用原生js写ajax实例(推荐)
2017/05/31 Javascript
vue中实现滚动加载更多的示例
2017/11/08 Javascript
微信小程序如何获取openid及用户信息
2018/01/26 Javascript
nodejs 生成和导出 word的实例代码
2018/07/31 NodeJs
JavaScript中十种一步拷贝数组的方法实例详解
2019/04/22 Javascript
配置一个vue3.0项目的完整步骤
2019/04/26 Javascript
微信小程序如何实现点击图片放大功能
2020/01/21 Javascript
vue中父子组件传值,解决钩子函数mounted只运行一次的操作
2020/07/27 Javascript
[47:08]OG vs INfamous 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python 字符串只保留汉字的方法
2018/11/16 Python
Python 一句话生成字母表的方法
2019/01/02 Python
在numpy矩阵中令小于0的元素改为0的实例
2019/01/26 Python
python+numpy实现的基本矩阵操作示例
2019/07/19 Python
Python爬虫爬取杭州24时温度并展示操作示例
2020/03/27 Python
CSS3实现头像旋转效果
2017/03/13 HTML / CSS
html5的canvas元素使用方法介绍(画矩形、画折线、圆形)
2014/04/14 HTML / CSS
电影T恤、80年代T恤和80年代服装:TV Store Online
2020/01/05 全球购物
仓管岗位职责范本
2014/02/08 职场文书
电焊工岗位工作职责
2014/07/09 职场文书
小学五年级(说明文3篇)
2019/08/13 职场文书
《狼牙山五壮士》读后感:宁死不屈,视死如归
2019/08/16 职场文书
Python破解极验滑动验证码详细步骤
2021/05/21 Python
mysql 带多个条件的查询方式
2021/06/05 MySQL
基于Apache Hudi在Google云构建数据湖平台的思路详解
2022/04/07 Servers