如何使用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实现将绝对URL替换成相对URL的方法
Jun 28 Python
python更新列表的方法
Jul 28 Python
Python制作数据导入导出工具
Jul 31 Python
Python 读写文件和file对象的方法(推荐)
Sep 12 Python
深入浅析ImageMagick命令执行漏洞
Oct 11 Python
Django 跨域请求处理的示例代码
May 02 Python
对Python中数组的几种使用方法总结
Jun 28 Python
查找python项目依赖并生成requirements.txt的方法
Jul 10 Python
python使用pip安装SciPy、SymPy、matplotlib教程
Nov 20 Python
python实现实时视频流播放代码实例
Jan 11 Python
PyTorch-GPU加速实例
Jun 23 Python
python多次执行绘制条形图
Apr 20 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
操作Oracle的php类
2006/10/09 PHP
与数据库连接
2006/10/09 PHP
php实现快速排序法函数代码
2012/08/27 PHP
PHP程序级守护进程的实现与优化的使用概述
2013/05/02 PHP
用Zend Studio+PHPnow+Zend Debugger搭建PHP服务器调试环境步骤
2014/01/19 PHP
PHP获取栏目的所有子级和孙级栏目的ID号示例
2014/04/01 PHP
php 无限级分类,超级简单的无限级分类,支持输出树状图
2014/06/29 PHP
详细对比php中类继承和接口继承
2018/10/11 PHP
js 遍历对象的属性的代码
2011/12/29 Javascript
jquery表格内容筛选实现思路及代码
2013/04/16 Javascript
JS定义回车事件(实现代码)
2013/07/08 Javascript
JS 实现导航栏悬停效果(续)
2013/09/24 Javascript
JSONP和批量操作功能的实现方法
2016/08/21 Javascript
JS正则表达式修饰符global(/g)用法分析
2016/12/27 Javascript
用Vue-cli搭建的项目中引入css报错的原因分析
2017/07/20 Javascript
Nodejs文件上传、监听上传进度的代码
2020/03/27 NodeJs
详解Vue3中对VDOM的改进
2020/04/23 Javascript
[03:23:49]2016.12.17日完美“圣”典全回顾
2016/12/19 DOTA
Python实现抓取网页生成Excel文件的方法示例
2017/08/05 Python
详解python中executemany和序列的使用方法
2017/08/12 Python
python numpy格式化打印的实例
2018/05/14 Python
利用Python如何生成便签图片详解
2018/07/09 Python
Python除法之传统除法、Floor除法及真除法实例详解
2019/05/23 Python
HTML5本地数据库基础操作详解
2016/04/26 HTML / CSS
资生堂美国官网:Shiseido美国
2016/09/02 全球购物
为有想象力的人提供的生活方式商店:Firebox
2018/06/04 全球购物
自动化专业本科毕业生求职信
2013/10/20 职场文书
2014年向国旗敬礼活动总结
2014/09/27 职场文书
车辆年检委托书范本
2014/10/14 职场文书
2015年学习部工作总结范文
2015/03/31 职场文书
在职证明书模板
2015/06/15 职场文书
先进个人主要事迹怎么写
2015/11/04 职场文书
浅谈Mysql多表连接查询的执行细节
2021/04/24 MySQL
Python基础之常用库常用方法整理
2021/04/30 Python
JavaScript分页组件使用方法详解
2021/07/26 Javascript
oracle数据库去除重复数据
2022/05/20 Oracle