如何使用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 面向对象 成员的访问约束
Dec 23 Python
python实现从一组颜色中找出与给定颜色最接近颜色的方法
Mar 19 Python
使用Python的Twisted框架构建非阻塞下载程序的实例教程
May 25 Python
Python简单实现安全开关文件的两种方式
Sep 19 Python
python生成圆形图片的方法
Mar 25 Python
Python脚本修改阿里云的访问控制列表的方法
Mar 08 Python
django为Form生成的label标签添加class方式
May 20 Python
django表单中的按钮获取数据的实例分析
Jul 31 Python
Python GUI库Tkiner使用方法代码示例
Nov 27 Python
Python页面加载的等待方式总结
Feb 28 Python
教你利用python实现企业微信发送消息
May 23 Python
使用python求解迷宫问题的三种实现方法
Mar 17 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中4个加速、缓存扩展的区别和选用建议
2014/03/12 PHP
帝国CMS留言板回复后发送EMAIL通知客户
2015/07/06 PHP
如何用JavaScript动态呼叫函数(两种方式)
2013/05/03 Javascript
在父页面调用子页面的JS方法
2013/09/29 Javascript
jquery索引在使用中的一些困惑
2013/10/24 Javascript
jquery插件hiAlert实现网页对话框美化
2015/05/03 Javascript
AngularJS学习笔记之基本指令(init、repeat)
2015/06/16 Javascript
javascript常用经典算法实例详解
2015/11/25 Javascript
Boostrap入门准备之border box
2016/05/09 Javascript
Javascript的比较汇总
2016/07/25 Javascript
原生js实现网易轮播图效果
2020/04/10 Javascript
Bootstrap Modal遮罩弹出层(完整版)
2016/11/21 Javascript
浅谈node的事件机制
2017/10/09 Javascript
jQuery length 和 size()区别总结
2018/04/26 jQuery
简单两步使用node发送qq邮件的方法
2019/03/01 Javascript
深入解析Python中的上下文管理器
2016/06/28 Python
python3中函数参数的四种简单用法
2018/07/09 Python
python如何创建TCP服务端和客户端
2018/08/26 Python
Python把对应格式的csv文件转换成字典类型存储脚本的方法
2019/02/12 Python
Python3.5面向对象程序设计之类的继承和多态详解
2019/04/24 Python
树莓派+摄像头实现对移动物体的检测
2019/06/22 Python
python命令行参数用法实例分析
2019/06/25 Python
python修改字典键(key)的方法
2019/08/05 Python
使用django和vue进行数据交互的方法步骤
2019/11/11 Python
浅析pip安装第三方库及pycharm中导入第三方库的问题
2020/03/10 Python
pycharm-professional-2020.1下载与激活的教程
2020/09/21 Python
Python爬虫爬取微博热搜保存为 Markdown 文件的源码
2021/02/22 Python
PHP如何与mysql建立链接
2013/05/05 面试题
社会公德演讲稿
2014/05/20 职场文书
李开复演讲稿
2014/05/24 职场文书
党员批评与自我批评思想汇报
2014/10/08 职场文书
机关干部三严三实心得体会
2014/10/13 职场文书
幼儿园教师个人工作总结2015
2015/05/12 职场文书
感谢师恩主题班会
2015/08/17 职场文书
各国货币符号大全
2022/02/17 杂记
Python docx库删除复制paragraph及行高设置图片插入示例
2022/07/23 Python