python- 截图实现

所用到的一些包

* PIL中的ImageGrab库可以实现屏幕的截图
* tkinter可以实现UI的设置
* time中的sleep可以实现休息时间

代码讲解

以下代码只是讲解可能无法运行

import tkinter
root = tkinter.Tk()

root.state("icon") 
# 最小化主窗口,这个需要等待时间,所以只用后,最好sleep(),等待


root.state("normal") 
# 恢复主窗口


from PIL import ImageGrab
im = ImageGrab() 
# 不向ImageGrab传参时,可以实现全屏幕截图
im0 =ImageGrab.grab((300, 100, 1400, 600))
# 向ImageGrab传参(元素个数为4的元组)时,可以实现矩形范围截图,四个元素分别是
#(左上角顶点,左下角顶点,右上角顶点,右下角顶点)

im.save('filename') 
# 保存图片文件 (扩展名:png)

im.close() 
# 关闭文件

import tkinter as tk
Canvas = tk.Canvas() # 创建画布

Canvas.create_image(width,height,image) # 插入画布的宽度与高度(两个参数的位置不可以改变)
lastDraw = self.Canvas.create_rectangle(a,b,c,d,outline="black") # 在Canvas上绘制矩形,abcd四个参数分别是矩形的4个顶点
Canvas.delete(lastDraw) # 删除Canvas上的矩形

程序代码

import tkinter as tk
from PIL import ImageGrab as IG # IG牛逼!
import tkinter.messagebox
from time import sleep
root = tk.Tk()
class MyCapture:
    def __init__(self,FileName):
        self.Start = False # 是否开始截图?


        self.X = tk.IntVar(value=0)
        self.Y = tk.IntVar(value=0)
        # X Y 主要存储了开始部分截图,左键按下的位置

        self.screenWidth = root.winfo_screenwidth()
        self.screenHeight = root.winfo_screenheight()
        # 获取窗口的大小(分辨率)

        self.top = tk.Toplevel(root,width=self.screenWidth,
                               height=self.screenHeight)
        self.top.overrideredirect(True)
        # 不显示标题栏

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

        self.image = tk.PhotoImage(file=FileName)
        self.Canvas.create_image(self.screenWidth//2,
                                 self.screenHeight//2,
                                 image=self.image)
        '''
        self.screenWidth//2,
        self.screenHeight//2,
        意思是将图片显示在画布的中央(且两个参数的位置不可以互换!!)
        '''
        def Down(event):
            self.Start = True
            self.X.set(event.x) # 记录开始X
            self.Y.set(event.y) # 记录开始y
        self.Canvas.bind("<Button-1>",Down)
        def Move(event):
            global lastDraw
            if self.Start == False:
                return # 如果截图开始,移动鼠标啥事没有
            try:
                self.Canvas.delete(lastDraw)
            except Exception as e:
                print(e)

            lastDraw = self.Canvas.create_rectangle(self.X.get(),
                                                    self.Y.get(),
                                                    event.x,
                                                    event.y,
                                                    outline="black")
            # 绘制一个矩形区域
        self.Canvas.bind("<B1-Motion>",Move)

        def Up(event):
            self.Start = False # 退出截图模式
            try:
                self.Canvas.delete(lastDrew)
            except:
                pass
            l,r = sorted([self.X.get(),event.x])
            t,b = sorted([self.Y.get(),event.y])
            IM = IG.grab((l+1,t+1,r,b))
            import tkinter.filedialog
            try:
                FileName = tkinter.filedialog.asksaveasfilename(title="保存截图",filetype=[('image','*.png')])
                print(FileName)
                FileName += '.png'

                if FileName:
                    IM.save(FileName)
            except ValueError:
                pass
            self.top.destroy()
        self.Canvas.bind("<ButtonRelease-1>",Up)
        def quit_mode(e):
            self.top.destroy()
        self.Canvas.bind('<Button-3>',quit_mode)
        self.Canvas.pack()

def Path_Pic():
    FileName = "path.png"
    root.state("icon")
    sleep(0.2)
    image = IG.grab()
    image.save(FileName)
    image.close()
    sleep(0.5)
    w = MyCapture(FileName)
    root.wait_window(w.top) # 等待窗口的关闭
    root.state("normal")

def Full_Pic():
    root.state("icon")
    import tkinter.filedialog
    FileName = tkinter.filedialog.asksaveasfilename(title="保存截图", filetype=[('image', '*.png')])
    print(FileName)
    FileName += '.png'
    sleep(0.2)
    image = IG.grab()
    image.save(FileName)
    image.close()
    tk.messagebox.showinfo("提示",'主人,已为你截图成功啦')
    root.state("normal")

Picture_Full = tk.Button(text="全屏幕截图",command=Full_Pic)
Picture_Full.pack()
Picture_Path = tk.Button(text="部分窗口截图",command=Path_Pic)
Picture_Path.pack()
root.mainloop()


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值