PyQT5制作自己的录屏软件

337 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情

有很多时候需要给客户进行远程演示,但是又不能重复演示很多次,而且用户有时间时自己又可能没有时间进行远程操作,于是自己动手制作一款录屏软件,虽然没有市面上的那么好,但好歹是自己动手的结果,而且结合前面的图像处理教程,可以制作许多特效,现在首先完成基础版。

首先开始录制和结束录制两个按钮是必须的,在录制过程中为了体现录制的过程是否正常需要一个label中循环的显示录制进程,说白了就是“录制中”三个字加几个.,这个点由1-3个循环的显示。

界面规划好了,下面直接开始制作界面,代码如下

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(703, 588)
        self.verticalLayoutWidget = QtWidgets.QWidget(Form)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(260, 210, 160, 80))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.pushButton = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.pushButton.setObjectName("pushButton")
        self.verticalLayout.addWidget(self.pushButton)
        self.pushButton_2 = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.pushButton_2.setObjectName("pushButton_2")
        self.verticalLayout.addWidget(self.pushButton_2)
        self.label = QtWidgets.QLabel(self.verticalLayoutWidget)
        self.label.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.verticalLayout.addWidget(self.label)
        self.label_2 = QtWidgets.QLabel(Form)
        self.label_2.setGeometry(QtCore.QRect(200, 300, 291, 181))
        self.label_2.setText("")
        self.label_2.setObjectName("label_2")

        self.retranslateUi(Form)
        self.pushButton.clicked.connect(Form.startCapture) # type: ignore
        self.pushButton_2.clicked.connect(Form.stopCapture) # type: ignore
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.pushButton.setText(_translate("Form", "录制屏幕"))
        self.pushButton_2.setText(_translate("Form", "结束录制"))
        self.label.setText(_translate("Form", "录制时请隐藏本窗口"))

界面运行时大概长下面的样子,他的样子取决于你对他的定制

image.png

上面提示录制时请隐藏本窗口,当然也可以设置自动隐藏,我已经设置好了,下面放主程序代码

from screenCapture import Ui_Form
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import sys
import time,threading
from datetime import datetime
from PIL import ImageGrab
import cv2
import numpy as np
from pynput import keyboard

class MainWindow(QMainWindow, Ui_Form):

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent=parent)
        self.setupUi(self)
        self.MyTimer = QTimer()
        self.MyTimer1 = QTimer()
        self.name = None

    def startCapture(self):
        self.countSave = 0
        self.fps = 15
        self.flag = False
        self.count = 1
        self.name = datetime.now().strftime('%Y-%m-%d %H-%M-%S')
        self.screen = ImageGrab.grab()
        self.width, self.high = self.screen.size
        self.fourcc = cv2.VideoWriter_fourcc('X', 'V', 'I', 'D')
        self.video = cv2.VideoWriter('%s.avi' % self.name, self.fourcc, self.fps, (self.width, self.high))
        print('开始录制!')
        self.label_2.setText("录制中!")
        self.start_time = time.time()
        self.showMinimized()
        self.MyTimer.start(50)
        self.MyTimer.timeout.connect(self.video_record)

    def video_record(self):  # 录入视频
        if self.flag:
            print("录制结束!")
            self.final_time = time.time()
            self.video.release()
        if self.count == 1:
            self.label_2.setText("录制中.")
        elif self.count == 2:
            self.label_2.setText("录制中..")
        else:
            self.label_2.setText("录制中...")
        self.count += 1
        self.count = self.count % 4
        self.im = ImageGrab.grab()
        frame = cv2.cvtColor(np.array(self.im), cv2.COLOR_RGB2BGR)
        self.video.write(frame)

    def stopCapture(self):
        if self.MyTimer.isActive():
            self.MyTimer.stop()
        self.label_2.setText("录制结束\n录制文件名:{}".format(self.name))
        if self.name is None:
            self.label_2.setText("视频还未录制!")
        else:
            self.flag = True


if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

image.png

image.png

录制结束时提示录制结束,并将录制的文件名输出到label中显示

image.png

录取文件信息如下

image.png