首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python+tkinter+pillow实现屏幕任意区域截图

Python+tkinter+pillow实现屏幕任意区域截图

作者头像
Python小屋屋主
发布于 2018-04-16 06:30:16
发布于 2018-04-16 06:30:16
8.2K3
举报
文章被收录于专栏:Python小屋Python小屋

基本思路:首先获取并显示全屏幕截图,然后在全屏幕截图上响应鼠标左键按下和抬起事件,最后进行二次截图。

import tkinter

import tkinter.filedialog

import os

from PIL import ImageGrab

from time import sleep

root = tkinter.Tk()

#设置窗口大小与位置

root.geometry('100x40+400+300')

#设置窗口大小不可改变

root.resizable(False, False)

#用来显示全屏幕截图并响应二次截图的窗口类

class MyCapture:

def __init__(self, png):

#变量X和Y用来记录鼠标左键按下的位置

self.X = tkinter.IntVar(value=0)

self.Y = tkinter.IntVar(value=0)

#屏幕尺寸

screenWidth = root.winfo_screenwidth()

screenHeight = root.winfo_screenheight()

#创建顶级组件容器

self.top = tkinter.Toplevel(root, width=screenWidth, height=screenHeight)

#不显示最大化、最小化按钮

self.top.overrideredirect(True)

self.canvas = tkinter.Canvas(self.top,bg='white', width=screenWidth, height=screenHeight)

#显示全屏截图,在全屏截图上进行区域截图

self.image = tkinter.PhotoImage(file=png)

self.canvas.create_image(screenWidth//2, screenHeight//2, image=self.image)

#鼠标左键按下的位置

def onLeftButtonDown(event):

self.X.set(event.x)

self.Y.set(event.y)

#开始截图

self.sel = True

self.canvas.bind('<Button-1>', onLeftButtonDown)

#鼠标左键移动,显示选取的区域

def onLeftButtonMove(event):

if not self.sel:

return

global lastDraw

try:

#删除刚画完的图形,要不然鼠标移动的时候是黑乎乎的一片矩形

self.canvas.delete(lastDraw)

except Exception as e:

pass

lastDraw = self.canvas.create_rectangle(self.X.get(), self.Y.get(), event.x, event.y, outline='black')

self.canvas.bind('<B1-Motion>', onLeftButtonMove)

#获取鼠标左键抬起的位置,保存区域截图

def onLeftButtonUp(event):

self.sel = False

try:

self.canvas.delete(lastDraw)

except Exception as e:

pass

sleep(0.1)

#考虑鼠标左键从右下方按下而从左上方抬起的截图

left, right = sorted([self.X.get(), event.x])

top, bottom = sorted([self.Y.get(), event.y])

pic = ImageGrab.grab((left+1, top+1, right, bottom))

#弹出保存截图对话框

fileName = tkinter.filedialog.asksaveasfilename(title='保存截图', filetypes=[('image', '*.jpg *.png')])

if fileName:

pic.save(fileName)

#关闭当前窗口

self.top.destroy()

self.canvas.bind('<ButtonRelease-1>', onLeftButtonUp)

#让canvas充满窗口,并随窗口自动适应大小

self.canvas.pack(fill=tkinter.BOTH, expand=tkinter.YES)

#开始截图

def buttonCaptureClick():

#最小化主窗口

root.state('icon')

sleep(0.2)

filename = 'temp.png'

#grab()方法默认对全屏幕进行截图

im = ImageGrab.grab()

im.save(filename)

im.close()

#显示全屏幕截图

w = MyCapture(filename)

buttonCapture.wait_window(w.top)

#截图结束,恢复主窗口,并删除临时的全屏幕截图文件

root.state('normal')

os.remove(filename)

buttonCapture = tkinter.Button(root, text='截图', command=buttonCaptureClick)

buttonCapture.place(x=10, y=10, width=80, height=20)

#启动消息主循环

root.mainloop()

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-08-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python小屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
3 条评论
热度
最新
我是mac 无法直接运行 在新窗口弹出显示图片那里就没反应了 确实给全凭截了图 但是没有开新窗口展示 也没有后续的鼠标监听。。。 是因为系统的原因吗
我是mac 无法直接运行 在新窗口弹出显示图片那里就没反应了 确实给全凭截了图 但是没有开新窗口展示 也没有后续的鼠标监听。。。 是因为系统的原因吗
11点赞举报
我的mac也有这个问题请问你解决了吗
我的mac也有这个问题请问你解决了吗
回复回复点赞举报
居然拿来就能直接用……太给力了!谢谢!
居然拿来就能直接用……太给力了!谢谢!
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
用python实现选择截图区域
一直想用python实现一个类似QQ截图的功能,但不直接截图,而是返回截图的区域,以下是代码
py3study
2020/01/10
3.9K0
Python实现计算机屏幕任意区域截图
程序功能与用法:运行后有个主窗体,上面有个按钮,单击后开始截图,鼠标坐标落下开始截图,鼠标左键抬起表示截图结束,然后弹出对话框提示保存截图文件。 本文要点在于Python扩展库pillow提供的ImageGrab支持全屏幕或指定区域的截图。 import tkinter import tkinter.filedialog import os from PIL import ImageGrab from time import sleep #创建tkinter主窗口 root = tkinter.Tk() #
Python小屋屋主
2018/04/16
6.3K0
Python实现屏幕取色器功能
代码主要思路:首先获取全屏幕截图,在截取的图像上获取指定位置的像素颜色值并转换为十六进制表示形式。 遗憾之处:这个程序的部分代码比较长,在手机上查看时这些换行可能会影响阅读质量,记得之前有个朋友提过建议让我加上代码块,不过我试了试,微信公众号后台的编辑器不支持这个功能,网上找了几个编辑器也不太好用。如果有朋友知道简单易用的支持代码块的编辑器还请推荐一下,谢谢! import os from time import sleep import tkinter import tkinter.filedialog
Python小屋屋主
2018/04/17
8K3
基于tkinter的GUI编程
tkinter:tkinter是绑定了Python的TKGUI工具集,就是Python包装的Tcl代码,通过内嵌在Python解释器内部的Tcl 解释器实现的,它是Python标准库的一部分,所以使用它进行GUI编程不需要另外安装第三方库的。
py3study
2020/01/16
6K0
基于tkinter的GUI编程
tkinter -- Event(1)
分别测试鼠标的 Relase 事件,只有当鼠标被 Relase 后移动才回产生 Relase 事件
py3study
2018/08/03
5500
Python使用tkinter打造自定义对话框完整代码
问题来源:前一阵发过一个技术文章Python编写抽奖式随机提问程序,其中有个弹出式对话框,好像上海科技大学宋老师在群里当时问了一句对话框中中奖姓名是否能显示的大一些,如图: 当时记得标准的tkinte
Python小屋屋主
2018/04/16
3.2K0
Python使用tkinter打造自定义对话框完整代码
python3 五子棋(tkinter)
BOARD_WIDTH = 535 BOARD_HEIGHT = 536 BOARD_SIZE = 15
用户5760343
2019/12/12
1.1K0
Python实现局域网内屏幕广播的技术要点分析
为更好地保证教学质量和提高学生的学习积极性,我使用Python开发了一套课堂教学管理系统,具有在线点名、在线答疑、随机提问、在线作业管理、在线自测、在线考试、数据汇总、试卷生成、屏幕广播等功能,教师端
Python小屋屋主
2018/04/16
1.6K0
Python实现局域网内屏幕广播的技术要点分析
Python: 屏幕取色器(识别屏幕上不同位置的颜色)
文章背景:工作中,有时候需要判断图片中不同位置的颜色。有些颜色不太容易区分,所以想通过Python编写代码,通过屏幕取点,获取某个位置的颜色值。
Exploring
2022/09/20
5.7K0
Python:  屏幕取色器(识别屏幕上不同位置的颜色)
快乐游戏,解放双手
上回说到这个PyUserInput这个库能够模拟鼠标和键盘点击(没看过的朋友底部有传送门),今天老肥再来实战一波游戏脚本制作。
老肥码码码
2020/02/26
3660
快乐游戏,解放双手
软件测试|超好用超简单的Python GUI库——tkinter(二)
Tkinter中,主窗口控件(window)是一切控件的基础,它好比是一台高速运转的机器,而其他控件则相当于这台机器上的部件,比如齿轮、链条、螺丝等等。由此我们知道,主窗口是一切控件的基础,所有的控件的都需要通过主窗口来显示。
霍格沃兹测试开发Muller老师
2023/04/10
3K0
python tkinter 简单实例
# 1920*1080    表示在屏幕在宽度上上有1920个点, 高度上有1080个点
用户7886150
2020/12/28
2.7K0
python tkinter 设计指南
pack() 是一种较为简单的布局方法,在不使用任何参数的情况下,它会将控件以添加时的先后顺序,自上而下,一行一行的进行排列,并且默认居中显示。pack() 方法的常用参数如下所示:
独元殇
2023/03/21
7.6K0
tkinter学习系列(二)之窗口的设置
目录 (一)窗体的最小框架 1.说明: 2.源代码: 3.实现效果: (二)窗体的基本设置 1.说明: 2.完整代码: 3.实现效果: (三)窗体的外形设置 1.说明: 2.完整代码: 3.实现效果: (四)窗体的三个方法: 1.获取屏幕的大小 2.获取窗体的大小 3.获取窗体的位置 目录: 1.窗体的最小框架 2.窗体的基本设置 3.窗体的外形设置 (一)窗体的最小框架 1.说明: 需要导入标准库: import tkinter 2.源代码: # 导入模块,并取别名 impor
py3study
2020/01/17
1.2K0
Python写一个像QQ可快捷键唤起区域截屏的应用
1).首先要能响应快捷键调起截屏程序,像QQ使用Ctrl+shift+B可以截屏一样;
一墨编程学习
2019/05/30
2.5K1
python-tkinter 实现各种个样的撩妹鼠标拖尾
系统的拖尾已经无法满足我们了,女朋友叫你把鼠标拖尾换成她的照片,让你时时刻刻都可以看见她,这个要求你答不答应。
大家一起学编程
2021/09/18
7650
python-tkinter 实现各种个样的撩妹鼠标拖尾
tkinter: 事件 & 绑定 (Events and Bindings)
目的 tkinter 获取 键盘输入 与 鼠标输入 。 实现代码 # coding=utf-8 import tkinter as tk root = tk.Tk() def center_window(w, h): # 获取屏幕 宽、高 ws = root.winfo_screenwidth() hs = root.winfo_screenheight() # 计算 x, y 位置 x = (ws/2) - (w/2) y = (hs/2) - (
JNingWei
2018/09/28
7860
Python 图形化界面基础篇:处理鼠标事件
在 Python 图形用户界面( GUI )应用程序开发中,处理鼠标事件是一项重要的任务。鼠标事件包括点击、双击、移动、释放等操作,通过捕获这些事件,你可以实现各种交互功能,如绘图、拖放、点击按钮等。在本文中,我们将深入研究如何使用 Python 的 Tkinter 库来处理鼠标事件,并演示如何在应用程序中实现一些常见的鼠标交互功能。
小蓝枣
2023/09/17
1.9K0
Python 图形化界面基础篇:处理鼠标事件
Python图像处理模块pillow子模块Image用法精要
Image是pillow库中一个非常重要的模块,提供了大量用于图像处理的方法。使用该模块时,首先需要导入。 >>> from PIL import Image 接下来,我们通过几个示例来简单演示一下这个模块的用法。 (1)打开图像文件 >>> im = Image.open('sample.jpg') (2)显示图像 >>> im.show() (3)查看图像信息 >>> im.format #查看图像格式 'JPEG' >>> im.size #查看图像大小,格式为(宽度, 高度) (200, 100
Python小屋屋主
2018/04/16
1.8K0
ubuntu 18.04设置系统自带系统截图快捷键
ubuntu 18.04自带一个截图工具gnome-screenshot,有三种模式,全屏截图、当前活动窗口截图、选取活动区域截图
Enterprise_
2019/06/14
2.8K0
ubuntu 18.04设置系统自带系统截图快捷键
相关推荐
用python实现选择截图区域
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档