Python 实现全截屏或自定义截屏

AI摘要
Deepseek提供支持

导入模块

首先,导入必要的模块:

import tkinter
import tkinter.filedialog
import os
from PIL import ImageGrab
from time import sleep
  • tkinter:用于构建图形用户界面。
  • tkinter.filedialog:用于创建文件对话框,以便用户选择保存截图的位置。
  • os:提供与操作系统交互的功能,此处可能用于文件操作。
  • PIL 中的 ImageGrab:用于进行屏幕截图。
  • time 中的 sleep:用于在程序执行中暂停一段时间,这里可能用于控制截图时机。

MyCapture类

然后定义一个名为 MyCapture 的类,用于创建截图工具的界面和功能

广告
广告图片

class MyCapture:
    def __init__(self, png):
        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)
  • MyCapture 类用于创建截图工具的界面和功能。
  • __init__ 方法初始化截图工具窗口,包括画布、图片和窗口大小等设置。

鼠标处理

    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='blue')

    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)
  • 这三个函数分别处理了鼠标左键按下、移动和释放事件。
  • onLeftButtonDown:记录鼠标按下时的坐标。
  • onLeftButtonMove:在鼠标移动时绘制选中区域的矩形框。
  • onLeftButtonUp:在鼠标释放时完成截图操作。

按钮点击事件处理函数

def buttonCaptureClick():
root.state('icon')
sleep(0.2)
filename = 'temp.png'
im = ImageGrab.grab()
im.save(filename)
im.close()

w = MyCapture(filename)
buttonCapture.wait_window(w.top)

root.state('normal')
os.remove(filename)
def fullScreenCapture():
root.state('icon')
sleep(0.2)
filename = 'full_screen_temp.png'
im = ImageGrab.grab()
im.save(filename)
im.close()

pic = ImageGrab.grab()
fileName = tkinter.filedialog.asksaveasfilename(title='保存截图', filetypes=[('JPG files', '*.jpg')])
if fileName:
    pic.save(fileName+'.jpg')

root.state('normal')
os.remove(filename)
  • buttonCaptureClick 函数处理区域截图按钮点击事件,它先将窗口最小化,然后保存当前屏幕截图到临时文件,接着创建 MyCapture 实例,进行截图操作,最后恢复窗口状态并删除临时文件。
  • fullScreenCapture 函数处理全屏截图按钮点击事件,它也是先最小化窗口,保存全屏截图到临时文件,然后通过文件对话框询问用户保存位置并保存截图,最后恢复窗口状态并删除临时文件。

主程序

root = tkinter.Tk()
root.geometry('300x100+300+200')
root.resizable(False, False)

buttonCapture = tkinter.Button(root, text='区域截图', command=buttonCaptureClick, relief=tkinter.RAISED, bd=3, font=('Helvetica', 12, 'bold'), bg='#4CAF50', fg='white')
buttonCapture.place(x=30, y=30, width=100, height=30)

buttonFullCapture = tkinter.Button(root, text='全屏截图', command=fullScreenCapture, relief=tkinter.RAISED, bd=3, font=('Helvetica', 12, 'bold'), bg='#008CBA', fg='white')
buttonFullCapture.place(x=170, y=30, width=100, height=30)

root.mainloop()
  • 创建了一个 Tkinter 窗口。
  • 设置窗口的大小和位置,并禁止用户调整窗口大小。
  • 创建了两个按钮,分别用于触发区域截图和全屏截图。
  • 启动主事件循环,使窗口能够响应用户的操作。

完整代码

import tkinter
import tkinter.filedialog
import os
from PIL import ImageGrab
from time import sleep

class MyCapture:
    def __init__(self, png):
        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='blue')
        
        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=[('JPG files', '*.jpg')])
            if fileName:
                pic.save(fileName+'.jpg')
            self.top.destroy()
        
        self.canvas.bind('<ButtonRelease-1>', onLeftButtonUp)
        self.canvas.pack(fill=tkinter.BOTH, expand=tkinter.YES)

def buttonCaptureClick():
    root.state('icon')
    sleep(0.2)
    
    filename = 'temp.png'
    im = ImageGrab.grab()
    im.save(filename)
    im.close()
    
    w = MyCapture(filename)
    buttonCapture.wait_window(w.top)
    
    root.state('normal')
    os.remove(filename)

def fullScreenCapture():
    root.state('icon')
    sleep(0.2)
    
    filename = 'full_screen_temp.png'
    im = ImageGrab.grab()
    im.save(filename)
    im.close()
    
    pic = ImageGrab.grab()
    fileName = tkinter.filedialog.asksaveasfilename(title='保存截图', filetypes=[('JPG files', '*.jpg')])
    if fileName:
        pic.save(fileName+'.jpg')
    
    root.state('normal')
    os.remove(filename)

root = tkinter.Tk()
root.geometry('300x100+300+200')
root.resizable(False, False)

buttonCapture = tkinter.Button(root, text='区域截图', command=buttonCaptureClick, relief=tkinter.RAISED, bd=3, font=('Helvetica', 12, 'bold'), bg='#4CAF50', fg='white')
buttonCapture.place(x=30, y=30, width=100, height=30)

buttonFullCapture = tkinter.Button(root, text='全屏截图', command=fullScreenCapture, relief=tkinter.RAISED, bd=3, font=('Helvetica', 12, 'bold'), bg='#008CBA', fg='white')
buttonFullCapture.place(x=170, y=30, width=100, height=30)

root.mainloop()
广告
广告图片
温馨提示 : 非特殊注明,否则均为©李联华的博客网原创文章,本站文章未经授权禁止任何形式转载;来自:俄亥俄州·哥伦布 ,欢迎您的访问!
文章链接:https://www.lilianhua.com/python-implementation-of-full-or-custom-screenshots.html
请先登录才能参与答题
距本场结束剩 00 00 00 00
轻量应用服务器 2核2G
200M峰值带宽,适用于网站搭建、Web应用、容器环境、电商独立站等
立即前往
扫码进入
扫描二维码购买
文澜千文

文澜千文

请登录以使用此功能。

海玉石头饼石子烤馍 非油炸零食饼干 原味720g 山西特产 海玉石头饼石子烤馍 非油炸零食饼干 原味720g 山西特产
Loading...
OpenClaw

OpenClaw 龙虾

AI AGENT GATEWAY
在您的服务器部署 OpenClaw,打造专属极速 AI 助手。
零门槛一键部署环境
支持 QQ/飞书/微信 渠道
跨平台指令分发执行
立即安装