如何使用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使用百度API上传文件到百度网盘代码分享
Nov 08 Python
python开启多个子进程并行运行的方法
Apr 18 Python
Python基于checksum计算文件是否相同的方法
Jul 09 Python
python实现kNN算法
Dec 20 Python
pandas把dataframe转成Series,改变列中值的类型方法
Apr 10 Python
python单例模式实例解析
Aug 28 Python
Django框架用户注销功能实现方法分析
May 28 Python
python中pip的使用和修改下载源的方法
Jul 08 Python
python实现微信自动回复机器人功能
Jul 11 Python
Python threading的使用方法解析
Aug 28 Python
UI自动化定位常用实现方法代码示例
Oct 27 Python
详解matplotlib中pyplot和面向对象两种绘图模式之间的关系
Jan 22 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
新闻分类录入、显示系统
2006/10/09 PHP
纯PHP生成的一个树叶图片画图例子
2014/04/16 PHP
浅析JavaScript中的delete运算符
2013/11/30 Javascript
JS动态创建DOM元素的方法
2015/06/09 Javascript
JavaScript每天定时更换皮肤样式的方法
2015/07/01 Javascript
简单谈谈JavaScript的同步与异步
2015/12/31 Javascript
JavaScript基础知识点归纳(推荐)
2016/07/09 Javascript
浅谈jQuery hover(over, out)事件函数
2016/12/03 Javascript
JS实现滑动门效果的方法详解
2016/12/19 Javascript
JavaScript提高加载和执行效率的方法
2017/02/03 Javascript
详解vue-cli快速构建项目以及引入bootstrap、jq
2017/05/26 Javascript
Vue脚手架编写试卷页面功能
2020/03/17 Javascript
从零学python系列之数据处理编程实例(一)
2014/05/22 Python
python dict.get()和dict['key']的区别详解
2016/06/30 Python
详解python的webrtc库实现语音端点检测
2017/05/31 Python
利用python实现简单的循环购物车功能示例代码
2017/07/05 Python
Python机器学习之SVM支持向量机
2017/12/27 Python
解决Tensorflow使用pip安装后没有model目录的问题
2018/06/13 Python
pyqt5实现登录界面的模板
2020/05/30 Python
Python scrapy增量爬取实例及实现过程解析
2019/12/24 Python
python 实现多维数组(array)排序
2020/02/28 Python
Python ConfigParser模块的使用示例
2020/10/12 Python
python 监控服务器是否有人远程登录(详细思路+代码)
2020/12/18 Python
css3学习之2D转换功能详解
2016/12/23 HTML / CSS
施华洛世奇西班牙官网:SWAROVSKI西班牙
2019/06/06 全球购物
Java里面StringBuilder和StringBuffer有什么区别
2016/06/06 面试题
仓管员岗位职责范文
2013/11/08 职场文书
高职教师先进事迹材料
2014/08/24 职场文书
爱护公共设施演讲稿
2014/09/13 职场文书
房产协议书范本2014
2014/09/30 职场文书
校运动会广播稿300字
2014/10/07 职场文书
领导干部作风整顿个人剖析材料
2014/10/11 职场文书
2014年健康教育工作总结
2014/11/20 职场文书
接待员岗位职责
2015/02/13 职场文书
2015年小学开学寄语
2015/02/27 职场文书
Nginx下SSL证书安装部署步骤介绍
2021/12/06 Servers