如何使用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 相关文章推荐
python3使用urllib示例取googletranslate(谷歌翻译)
Jan 23 Python
Python实现方便使用的级联进度信息实例
May 05 Python
python实现颜色空间转换程序(Tkinter)
Dec 31 Python
Python基于多线程实现ping扫描功能示例
Jul 23 Python
Python中fnmatch模块的使用详情
Nov 30 Python
python 将对象设置为可迭代的两种实现方法
Jan 21 Python
Python(PyS60)实现简单语音整点报时
Nov 18 Python
Python2与Python3的区别点整理
Dec 12 Python
Python 音频生成器的实现示例
Dec 24 Python
tensorflow 模型权重导出实例
Jan 24 Python
python使用paramiko实现ssh的功能详解
Mar 06 Python
django表单中的按钮获取数据的实例分析
Jul 31 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根据传入参数合并多个JS和CSS文件的简单实现
2014/06/13 PHP
php生成html文件方法总结
2014/12/01 PHP
php微信公众开发之获取周边酒店信息的方法
2014/12/22 PHP
php版银联支付接口开发简明教程
2016/10/14 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
php写入文件不覆盖的实例讲解
2019/09/17 PHP
让您的菜单不离网站
2006/10/03 Javascript
tangram框架响应式加载图片方法
2013/11/21 Javascript
JS获取屏幕,浏览器窗口大小,网页高度宽度(实现代码)
2013/12/17 Javascript
javascript实现复制与粘贴操作实例
2014/10/16 Javascript
jQuery中eq()方法用法实例
2015/01/05 Javascript
jQuery操作DOM之获取表单控件的值
2015/01/23 Javascript
IE下使用jQuery重置iframe地址时内存泄露问题解决办法
2015/02/05 Javascript
JS使用面向对象技术实现的tab选项卡效果示例
2017/02/28 Javascript
尝试自己动手用react来写一个分页组件(小结)
2018/02/09 Javascript
react router4+redux实现路由权限控制的方法
2018/05/03 Javascript
Vue项目webpack打包部署到Tomcat刷新报404错误问题的解决方案
2018/05/15 Javascript
video.js 一个页面同时播放多个视频的实例代码
2018/11/27 Javascript
vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流)
2019/05/10 Javascript
解决layer.prompt无效的问题
2019/09/24 Javascript
angula中使用iframe点击后不执行变更检测的问题
2020/05/10 Javascript
python通过pil模块将raw图片转换成png图片的方法
2015/03/16 Python
利用Python脚本在Nginx和uwsgi上部署MoinMoin的教程
2015/05/05 Python
理解Python中的With语句
2016/03/18 Python
git进行版本控制心得详谈
2017/12/10 Python
基于pandas将类别属性转化为数值属性的方法
2018/07/25 Python
python爬虫 2019中国好声音评论爬取过程解析
2019/08/26 Python
Docker部署Python爬虫项目的方法步骤
2020/01/19 Python
使用python实现CGI环境搭建过程解析
2020/04/28 Python
基于python requests selenium爬取excel vba过程解析
2020/08/12 Python
html5 Canvas画图教程(5)—canvas里画曲线之arc方法
2013/01/09 HTML / CSS
Clos19英国:高档香槟、葡萄酒和烈酒在线购物平台
2020/07/10 全球购物
力学专业毕业生自荐信
2013/11/17 职场文书
班级聚会策划书
2014/01/16 职场文书
Java异常处理try catch的基本用法
2021/12/06 Java/Android
JavaWeb实现显示mysql数据库数据
2022/03/19 Java/Android