Python 在pyqt5中控制QThread?

Python 在pyqt5中控制QThread?,python,opencv,pyqt5,qthread,Python,Opencv,Pyqt5,Qthread,我用pyqt5和opencv编写了一个网络摄像头应用程序,可以保存实时视频。 截图: 我在不阻塞主应用程序的情况下使用了一个QThread进行流式处理。但问题是,我无法用我的按钮控制流媒体和保存视频。它开始录制时,我运行主程序,但我想让它与运行按钮和保存与停止按钮 我试着用录音参数来做,但有点奇怪。程序开始录制,我第一次按“停止”时,它完美地保存了视频。但当我试图用“开始”按钮保存第二个视频时。它不会在标签上开始流媒体,但当我关闭应用程序时,它正在保存视频 类线程(QThread): 录音=真

我用pyqt5和opencv编写了一个网络摄像头应用程序,可以保存实时视频。 截图:

我在不阻塞主应用程序的情况下使用了一个QThread进行流式处理。但问题是,我无法用我的按钮控制流媒体和保存视频。它开始录制时,我运行主程序,但我想让它与运行按钮和保存与停止按钮

我试着用录音参数来做,但有点奇怪。程序开始录制,我第一次按“停止”时,它完美地保存了视频。但当我试图用“开始”按钮保存第二个视频时。它不会在标签上开始流媒体,但当我关闭应用程序时,它正在保存视频

类线程(QThread):
录音=真
changePixmap=pyqtSignal(QImage)
cap=cv2.视频捕获(0)
帧宽度=int(cap.get(3))
框架高度=int(上限为(4))
out=cv2.VideoWriter('input.avi',cv2.VideoWriter_fourcc(
‘M’、‘J’、‘P’、‘G’、30(框宽、框高))
def运行(自):
自我记录时:
ret,frame=self.cap.read()
如果ret:
self.out.write(框架)
rgbImage=cv2.CVT颜色(帧,cv2.COLOR_BGR2RGB)
h、 w,ch=rgbImage.shape
bytesPerLine=ch*w
convertToQtFormat=QtGui.QImage(
rgbImage.data,w,h,bytesPerLine,QtGui.QImage.Format_RGB888)
p=convertToQtFormat.scaled(
350,350,PyQt5.QtCore.Qt.keepasspectratio)
self.changePixmap.emit(p)
#self.cap.release()
#self.out.release()
self.changePixmap.emit(p)
类Ui_主窗口(qtwidts.QWidget):
def设置UI(自我,主窗口):
MainWindow.setObjectName(“MainWindow”)
主窗口。调整大小(901593)
self.centralwidget=qtwidts.QWidget(主窗口)
self.centralwidget.setObjectName(“centralwidget”)
self.label=qtwidts.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(20,20,350,350))
self.label.setObjectName(“标签”)
self.th=螺纹(self)
self.th.changePixmap.connect(self.setImage)
self.th.start()
self.pushButton=qtwidts.QPushButton(self.centralwidget)
自身按钮设置几何(QtCore.QRect(20、320、261、31))
self.butdown.setObjectName(“butdown”)
self.button.clicked.connect(self.func)
self.label_2=qtwidts.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(47020261271))
self.label_2.setText(“”)
self.label_2.setObjectName(“label_2”)
self.pushButton_2=qtwidts.QPushButton(self.centralwidget)
自动按钮2.设置几何(QtCore.QRect(20、390、261、31))
self.butdown_2.setObjectName(“butdown_2”)
self.button_2.点击连接(self.func2)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar=qtwidts.QMenuBar(主窗口)
self.menubar.setGeometry(QtCore.QRect(0,0,901,22))
self.menubar.setObjectName(“menubar”)
MainWindow.setMenuBar(self.menubar)
self.statusbar=qtwidts.QStatusBar(主窗口)
self.statusbar.setObjectName(“statusbar”)
main window.setStatusBar(self.statusbar)
自重传(主窗口)
QtCore.QMetaObject.connectSlotsByName(主窗口)
def重新传输(自身,主窗口):
_translate=QtCore.QCoreApplication.translate
setWindowTitle(_translate(“MainWindow”、“MainWindow”))
self.putton.setText(_translate(“主窗口”、“记录”))
self.button_2.setText(_translate(“主窗口”、“停止”))
def setImage(自我,图像):
self.label.setPixmap(QPixmap.fromImage(图像))
def func(自我):
self.th.recording=True
def func2(自我):
自我记录=错误
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=qtwidts.QApplication(sys.argv)
MainWindow=QtWidgets.QMainWindow()
ui=ui\u主窗口()
ui.setupUi(主窗口)
MainWindow.show()
sys.exit(app.exec_())

我使用python标准库解决了这个问题

您的
正在进行自我录制:
循环在
run()
中只运行一次,完成后不能再次输入。在我的代码中,
self.playing
设置为false后,我等待再次设置ActionTaked事件以继续循环

从线程导入事件
类控制工具(QThread):
changePixmap=pyqtSignal(QImage)
定义初始化(自,视频路径):
super(Controltool,self)。\uuuu init\uuuuu()
self.running=Event()
self.running.set()
self.actiontaked=Event()
自我表现=错误
def运行(自):
#我们只在完成后才离开这个循环
当self.running.is_set()时:
self.actiontaked.clear()
自娱自乐时:
self.readFrame()
self.actiontaked.wait()
def读框(自身):
ret,frame=self.vidcap.read()
如果ret:
[…废话…]
self.changePixmap.emit(p)
def停止铺设(自):
自我表现=错误
def开始播放(自):
自弹=真
self.actiontaked.set()
你看到这篇文章了吗?