如何使用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 相关文章推荐
zbar解码二维码和条形码示例
Feb 07 Python
Python实例之wxpython中Frame使用方法
Jun 09 Python
查看django版本的方法分享
May 14 Python
情人节快乐! python绘制漂亮玫瑰
Aug 18 Python
python函数与方法的区别总结
Jun 23 Python
Numpy 中的矩阵求逆实例
Aug 26 Python
Python3实现mysql连接和数据框的形成(实例代码)
Jan 17 Python
tensorflow tf.train.batch之数据批量读取方式
Jan 20 Python
python实现提取str字符串/json中多级目录下的某个值
Feb 27 Python
浅谈Django QuerySet对象(模型.objects)的常用方法
Mar 28 Python
一文弄懂Pytorch的DataLoader, DataSet, Sampler之间的关系
Jul 03 Python
python 贪心算法的实现
Sep 18 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的一个完整SMTP类(解决邮件服务器需要验证时的问题)
2006/10/09 PHP
mysql总结之explain
2012/02/27 PHP
laravel admin实现分类树/模型树的示例代码
2020/06/10 PHP
jquery $.ajax入门应用二
2008/11/19 Javascript
js与jquery中获取当前鼠标的x、y坐标位置的代码
2011/05/23 Javascript
Jquery获取元素的父容器对象示例代码
2014/02/10 Javascript
JavaScript分秒倒计时器实现方法
2015/02/02 Javascript
JavaScript中textRange对象使用方法小结
2015/03/24 Javascript
javascript中字体浮动效果的简单实例演示
2015/11/18 Javascript
第二章之Bootstrap 页面排版样式
2016/04/25 Javascript
jQuery绑定事件的几种实现方式
2016/05/09 Javascript
详解angularJs模块ui-router之状态嵌套和视图嵌套
2017/04/28 Javascript
AngularJS实现的简单拖拽功能示例
2018/01/02 Javascript
解析Angular 2+ 样式绑定方式
2018/01/15 Javascript
基于vue-cli npm run build之后vendor.js文件过大的解决方法
2018/09/27 Javascript
JS前端面试必备——基本排序算法原理与实现方法详解【插入/选择/归并/冒泡/快速排序】
2020/02/24 Javascript
JS使用setInterval计时器实现挑战10秒
2020/11/08 Javascript
Python读写Excel文件的实例
2013/11/01 Python
python生成器generator用法实例分析
2015/06/04 Python
Python的for和break循环结构中使用else语句的技巧
2016/05/24 Python
浅析Python中元祖、列表和字典的区别
2016/08/17 Python
python3模块smtplib实现发送邮件功能
2018/05/22 Python
python读取目录下最新的文件夹方法
2018/12/24 Python
pandas中read_csv、rolling、expanding用法详解
2020/04/21 Python
使用HTML5的File实现base64和图片的互转
2013/08/01 HTML / CSS
关于HTML5语义标签的实践(blog页面)
2016/07/12 HTML / CSS
香港最大的洋酒零售连锁店:屈臣氏酒窖(Watson’s Wine)
2018/12/10 全球购物
美国手工艺品市场的领导者:Annie’s
2019/04/04 全球购物
波兰运动鞋网上商店:Distance.pl
2020/07/30 全球购物
英语专业大学生求职简历的自我评价
2013/10/18 职场文书
传媒专业推荐信范文
2013/11/23 职场文书
5.12护士节演讲稿
2014/04/30 职场文书
党支部换届选举方案
2014/05/08 职场文书
2015年城市管理工作总结
2015/05/23 职场文书
指导教师推荐意见
2015/06/05 职场文书
2016年习总书记讲话学习心得体会
2016/01/20 职场文书