相关文章推荐
刀枪不入的皮带  ·  巨头脊背发凉,苹果迈出第一步:7月起向广告平 ...·  8 月前    · 
谈吐大方的太阳  ·  【神圣的屎】曼岛TT 边三轮 ...·  1 年前    · 
大力的烤面包  ·  聚焦“3·15”·十大案例⑦|免费领养宠物却 ...·  1 年前    · 
善良的鞭炮  ·  刘浪前往南岳镇水濂村督导防汛、地质灾害防治和 ...·  1 年前    · 
坏坏的啤酒  ·  安徽宇敏铝业科技有限公司-郎溪县人民政府·  1 年前    · 
Code  ›  Python+tkinter+pillow实现屏幕任意区域截图开发者社区
https://cloud.tencent.com/developer/article/1097904
俊逸的罐头
2 年前
作者头像
Python小屋屋主
0 篇文章

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

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > Python小屋 > Python+tkinter+pillow实现屏幕任意区域截图

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

作者头像
Python小屋屋主
发布 于 2018-04-16 14:30:16
6.3K 3
发布 于 2018-04-16 14:30:16
举报

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

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

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

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

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

python
评论
登录 后参与评论
0 条评论
热度
最新
登录 后参与评论
关于作者
Python小屋屋主
0
文章
0
累计阅读量
0
获赞
前往专栏
领券
  • 社区

    • 专栏文章
    • 阅读清单
    • 互动问答
    • 技术沙龙
    • 技术视频
    • 团队主页
    • 腾讯云TI平台
  • 活动

    • 自媒体分享计划
    • 邀请作者入驻
    • 自荐上首页
    • 技术竞赛
  • 资源

    • 技术周刊
    • 社区标签
    • 开发者手册
    • 开发者实验室
  • 关于

    • 社区规范
    • 免责声明
    • 联系我们
    • 友情链接

腾讯云开发者

扫码关注腾讯云开发者

扫码关注腾讯云开发者

领取腾讯云代金券

热门产品

  • 域名注册
  • 云服务器
  • 区块链服务
  • 消息队列
  • 网络加速
  • 云数据库
  • 域名解析
  • 云存储
  • 视频直播

热门推荐

  • 人脸识别
  • 腾讯会议
  • 企业云
  • CDN加速
  • 视频通话
  • 图像分析
  • MySQL 数据库
  • SSL 证书
  • 语音识别

更多推荐

  • 数据安全
  • 负载均衡
  • 短信
  • 文字识别
  • 云点播
  • 商标注册
  • 小程序开发
  • 网站监控
  • 数据迁移

Copyright © 2013 - 2023 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有

深圳市腾讯计算机系统有限公司 ICP备案/许可证号: 粤B2-20090059 深公网安备号 44030502008569

腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287

问题归档 专栏文章 快讯文章归档 关键词归档 开发者手册归档 开发者手册 Section 归档

Copyright © 2013 - 2023 Tencent Cloud.

All Rights Reserved. 腾讯云 版权所有

登录 后参与评论
3
 
推荐文章
刀枪不入的皮带  ·  巨头脊背发凉,苹果迈出第一步:7月起向广告平台收取“30%广告税”_腾讯新闻
8 月前
谈吐大方的太阳  ·  【神圣的屎】曼岛TT 边三轮 ★HOLY - SHIT★SIDECAR【Isle of Man TT】_哔哩哔哩_bilibili
1 年前
大力的烤面包  ·  聚焦“3·15”·十大案例⑦|免费领养宠物却莫名签订分期贷款,其实是变相销售!_维护侨益_东莞市归国华侨联合会
1 年前
善良的鞭炮  ·  刘浪前往南岳镇水濂村督导防汛、地质灾害防治和应急处置工作-县区动态-衡阳市水利局
1 年前
坏坏的啤酒  ·  安徽宇敏铝业科技有限公司-郎溪县人民政府
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号