参考博文:超全!Python图形界面框架PyQt5使用指南! - 知乎
https://www.cnblogs.com/yunxiaofei/p/10804747.html
1、PyQt5安装
pip install pyqt5
pip install pyqt5-tools
我运行pip install pyqt5之后提示pyqt已经安装过了,根据提示安装的目录确实找到了pyqt
运行pip install pyqt5-tools成功安装,具体信息见下图:
2、启动qt designer
C:\Users\DIY-PC\AppData\Local\Programs\Python\Python38\Lib\site-packages\qt5_applications\Qt\bin
上面是我的存放地址
设计成这样:
3、ui转化为python
保存后将生成的.ui文件转化成.py文件,cmd命令行(快捷键win+r)中输入:
C:\Users\DIY-PC\AppData\Local\Programs\Python\Python38\python.exe -m PyQt5.uic.pyuic D:\python\pyqt\ui\screenshot.ui -o D:\python\pyqt\ui\screenshot.py
生成成功:
4、修改完善代码
5、完整代码
项目结构:
screenshot.py
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'D:\python\pyqt\ui\screenshot.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(400, 300)
self.confirm = QtWidgets.QDialogButtonBox(Dialog)
self.confirm.setGeometry(QtCore.QRect(30, 240, 341, 32))
self.confirm.setOrientation(QtCore.Qt.Horizontal)
self.confirm.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
self.confirm.setObjectName("confirm")
self.label = QtWidgets.QLabel(Dialog)
self.label.setGeometry(QtCore.QRect(30, 20, 54, 12))
self.label.setObjectName("label")
self.label_2 = QtWidgets.QLabel(Dialog)
self.label_2.setGeometry(QtCore.QRect(30, 50, 54, 12))
self.label_2.setObjectName("label_2")
self.label_3 = QtWidgets.QLabel(Dialog)
self.label_3.setGeometry(QtCore.QRect(30, 80, 54, 20))
self.label_3.setObjectName("label_3")
self.pattern = QtWidgets.QComboBox(Dialog)
self.pattern.setGeometry(QtCore.QRect(90, 80, 69, 22))
self.pattern.setObjectName("pattern")
self.pattern.addItem("")
self.pattern.addItem("")
self.inputdir = QtWidgets.QLineEdit(Dialog)
self.inputdir.setGeometry(QtCore.QRect(90, 20, 281, 20))
self.inputdir.setObjectName("inputdir")
self.outputdir = QtWidgets.QLineEdit(Dialog)
self.outputdir.setGeometry(QtCore.QRect(90, 50, 281, 20))
self.outputdir.setObjectName("outputdir")
self.output = QtWidgets.QTextEdit(Dialog)
self.output.setGeometry(QtCore.QRect(30, 130, 341, 101))
self.output.setObjectName("output")
self.retranslateUi(Dialog)
self.confirm.accepted.connect(Dialog.accept) # type: ignore
self.confirm.rejected.connect(Dialog.clearText) # type: ignore
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.label.setText(_translate("Dialog", "视频路径:"))
self.label_2.setText(_translate("Dialog", "输出路径:"))
self.label_3.setText(_translate("Dialog", "截取模式:"))
self.pattern.setCurrentText(_translate("Dialog", "按帧"))
self.pattern.setItemText(0, _translate("Dialog", "按帧"))
self.pattern.setItemText(1, _translate("Dialog", "按秒"))
main.py
import sys
import os
import cv2
import screenshot
from PyQt5.QtWidgets import QApplication, QDialog
import requests
class MainDialog(QDialog):
def __init__(self, parent=None):
super(QDialog, self).__init__(parent)
self.ui = screenshot.Ui_Dialog()
self.ui.setupUi(self)
def accept(self):
video_path=self.ui.inputdir.text()
f_save_path=self.ui.outputdir.text()
maskText = self.ui.pattern.currentText()
mask = self.getCode(maskText)
frame_interval = 2 # 设置帧率间隔
time_interval = 1 # 设置时间间隔(单位:s)
if (mask == 1):
print("当前模式:按照帧率截取视频\n帧率间隔:"+str(frame_interval))
elif (mask == 2):
print("当前模式:按照时间截取视频\n时间间隔:"+str(time_interval)+"s")
videos = os.listdir(video_path)
for video_name in videos:
file_name = video_name.split('.')[0] # 拆分视频文件名称 ,剔除后缀
folder_name = f_save_path + file_name # 保存图片的上级目录+对应每条视频名称 构成新的目录存放每个视频
os.makedirs(folder_name, exist_ok=True) # 创建存放视频的对应目录
vc = cv2.VideoCapture(video_path + video_name) # 读入视频文件
fps = vc.get(cv2.CAP_PROP_FPS) # 获取当前视频帧率
rval = vc.isOpened() # 判断视频是否打开
print(video_path + video_name)
c = 1
while rval: # 循环读取视频帧
rval, frame = vc.read() # videoCapture.read() 函数,第一个返回值为是否成功获取视频帧,第二个返回值为返回的视频帧;
pic_path = folder_name + '/'
if rval:
if(mask == 1):
if (c % round(frame_interval) == 0): # 每隔frame_interval帧存储一次
cv2.imencode('.jpg', frame)[1].tofile(
pic_path + file_name + '_' + str(round(c / frame_interval)) + '.jpg') # 中文路径也可以保存
#print(file_name + '_' + str(round(c / frame_interval)) + '.jpg')
cv2.waitKey(1)
c = c + 1
elif(mask == 2):
if (c % (round(fps)*time_interval) == 0): # 每隔time_interval秒存储一次
cv2.imencode('.jpg', frame)[1].tofile(
pic_path + file_name + '_' + str(round(c / fps)) + '.jpg')
print(file_name + '_' + str(round(c / fps)) + '.jpg')
cv2.waitKey(1)
c = c + 1
else:
break
vc.release()
outputText=('save_success:' + folder_name)
self.ui.output.setText(outputText)
def getCode(self, cityName):
cityDict = {"按帧": 1,
"按秒": 2}
return cityDict[cityName]
def clearText(self):
self.ui.textEdit.clear()
if __name__ == '__main__':
myapp = QApplication(sys.argv)
myDlg = MainDialog()
myDlg.show()
sys.exit(myapp.exec_())
6、运行效果