用python实现截屏录屏功能

python 复制代码
# -*-coding:GBK -*-

from datetime import datetime
from PIL import ImageGrab, ImageTk
import cv2
import numpy as np
import threading
import time
import os
import tkinter as tk
from tkinter import messagebox, simpledialog

class ScreenRecorderApp:
    def __init__(self, root):
        self.root = root
        self.root.title("屏幕录制器")
        self.root.geometry("200x150+%d+0" % (root.winfo_screenwidth() - 200))  # 设置窗口位置在右上角
        self.root.configure(bg="#f0f0f0")
        self.root.attributes('-topmost', True)  # 窗口置顶

        self.recording = False
        self.video = None

        self.start_button = tk.Button(root, text="开始录制", command=self.start_recording, bg="#4caf50", fg="white", font=("Arial", 12), activebackground="#45a049")
        self.start_button.pack(fill=tk.BOTH, expand=True, padx=10, pady=5)

        self.stop_button = tk.Button(root, text="停止录制", command=self.stop_recording, state=tk.DISABLED, bg="#f44336", fg="white", font=("Arial", 12), activebackground="#e53935")
        self.stop_button.pack(fill=tk.BOTH, expand=True, padx=10, pady=5)

        self.screenshot_button = tk.Button(root, text="截屏", command=self.take_screenshot, bg="#ff9800", fg="white", font=("Arial", 12), activebackground="#fb8c00")
        self.screenshot_button.pack(fill=tk.BOTH, expand=True, padx=10, pady=5)

    def start_recording(self):
        self.recording = True
        self.start_button.config(state=tk.DISABLED, bg="#a0a0a0")
        self.stop_button.config(state=tk.NORMAL, bg="#f44336")
        self.screenshot_button.config(state=tk.DISABLED)
        self.root.attributes('-alpha', 0.3)  # 提高透明度
        threading.Thread(target=self.record_screen).start()

    def stop_recording(self):
        self.recording = False
        self.start_button.config(state=tk.NORMAL, bg="#4caf50")
        self.stop_button.config(state=tk.DISABLED, bg="#a0a0a0")
        self.screenshot_button.config(state=tk.NORMAL)
        self.root.attributes('-alpha', 1.0)  # 恢复透明度

    def record_screen(self):
        name = datetime.now().strftime("%Y-%m-%d %H-%M-%S")
        screen = ImageGrab.grab()
        width, high = screen.size
        fourcc = cv2.VideoWriter_fourcc(*'mp4v')  # 修改为MP4格式
        self.video = cv2.VideoWriter(f'{name}.mp4', fourcc, 16, (width, high))
        print("record start !!!")
        while self.recording:
            img = ImageGrab.grab()
            imm = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)  # 转为opencv的BGR模式
            self.video.write(imm)
        print("record end !!!")
        self.video.release()
        time.sleep(1)  # 增加一个短暂的延迟,确保所有帧数据都被写入

        # 检查视频文件是否存在且大小不为零
        if os.path.exists(f'{name}.mp4') and os.path.getsize(f'{name}.mp4') > 0:
            print(f'视频文件 {name}.mp4 已生成')
            messagebox.showinfo("录制完成", f"视频文件 {name}.mp4 已生成")
        else:
            print(f'视频文件 {name}.mp4 未正确生成')
            messagebox.showerror("录制失败", f"视频文件 {name}.mp4 未正确生成")

        # 视频信息
        try:
            video = cv2.VideoCapture(f'{name}.mp4')
            fps = video.get(cv2.CAP_PROP_FPS)
            frames = video.get(cv2.CAP_PROP_FRAME_COUNT)
            if fps == 0 or frames == 0:
                print('视频文件可能未正确生成或为空')
            else:
                print('帧率=%.1f' % (fps))
                print('帧数=%.1f' % (frames))
                print('分辨率=(%d,%d)' % (int(video.get(cv2.CAP_PROP_FRAME_WIDTH)), int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))))
                print('时间=%.2f秒' % (int(frames) / fps))
        except Exception as e:
            print(f'读取视频文件信息时出错: {e}')

    def take_screenshot(self):
        if self.recording:
            messagebox.showwarning("警告", "录制过程中无法截屏")
            return

        self.root.attributes('-alpha', 0.0)  # 完全透明
        screenshot = ImageGrab.grab()
        self.root.attributes('-alpha', 1.0)  # 恢复透明度

        screenshot_name = datetime.now().strftime("%Y-%m-%d %H-%M-%S") + ".png"
        screenshot.save(screenshot_name)
        screenshot.show()
        messagebox.showinfo("截屏完成", f"截屏已保存为 {screenshot_name}")

if __name__ == '__main__':
    root = tk.Tk()
    app = ScreenRecorderApp(root)
    root.mainloop()

'''
# 安装PyInstaller
pip install pyinstaller

# 导航到你的Python脚本所在的目录
cd path/to/your/script

# 使用PyInstaller生成EXE文件
pyinstaller --onefile --windowed record_Screen.py


'''
相关推荐
molaifeng3 分钟前
Go 语言如何实现高性能网络 I/O:Netpoller 模型揭秘
开发语言·网络·golang
崇山峻岭之间11 分钟前
Matlab学习记录33
开发语言·学习·matlab
Evand J16 分钟前
【2026课题推荐】DOA定位——MUSIC算法进行多传感器协同目标定位。附MATLAB例程运行结果
开发语言·算法·matlab
小二·22 分钟前
Python Web 开发进阶实战:性能压测与调优 —— Locust + Prometheus + Grafana 构建高并发可观测系统
前端·python·prometheus
jllllyuz39 分钟前
基于MATLAB的二维波场模拟程序(含PML边界条件)
开发语言·matlab
忆锦紫1 小时前
图像增强算法:Gamma映射算法及MATLAB实现
开发语言·算法·matlab
七牛云行业应用1 小时前
重构实录:我删了 5 家大模型 SDK,只留了 OpenAI 标准库
python·系统架构·大模型·aigc·deepseek
知乎的哥廷根数学学派2 小时前
基于多模态特征融合和可解释性深度学习的工业压缩机异常分类与预测性维护智能诊断(Python)
网络·人工智能·pytorch·python·深度学习·机器学习·分类
亲爱的非洲野猪2 小时前
Java锁机制八股文
java·开发语言
LawrenceLan2 小时前
Flutter 零基础入门(十二):枚举(enum)与状态管理的第一步
开发语言·前端·flutter·dart