最近使用Pyqt5制作目标检测的ui界面时,想着增加一个运行等待的图片
但是增加后发现打开界面后第一次检测运行完全正常:输入数值点击开始检测——等待图片——显示运行结果
然后重新输入另一张图片再运行就会在出现:输入数值点击开始检测——等待图片——显示运行结果——等待图片——显示运行结果
不知道为什么会重复两次,虽然也有点怀疑是不是逻辑上有问题,但是没找到问题出在哪
完整代码如下:
class CamShow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(CamShow, self).__init__(parent)
self.setupUi(self)
self.fileBtn.clicked.connect(self.loadImage)
self.fileBtn_2.clicked.connect(self.jinzhi)
self.scale = 1
def jinzhi(self):
self.Infolabel_2.setText('未输入图像有效路径')
# 打开文件功能
def loadImage(self):
self.fname, _ = QFileDialog.getOpenFileName(self, '请选择图片', '.', '图像文件(*.jpg *.jpeg *.png)')
if self.fname:
self.Infolabel_2.setText('文件打开成功\n' + self.fname)
jpg = QtGui.QPixmap(self.fname).scaled(self.Imglabel_0.width(), self.Imglabel_0.height())
self.Imglabel_0.setPixmap(jpg)
# 开启检测按钮
self.fileBtn_2.clicked.connect(self.jiance)
else:
# print("打开文件失败")
self.Infolabel_2.setText('打开文件失败')
self.Imglabel_0.setPixmap(QPixmap(""))
def jiance(self):
thresh = self.lineEdit_X.text()
if self.fname:
if thresh:
thresh = int(thresh)
self.Infolabel_2.setText(' ')
#等待图片(问题就出在这里好像)
splash = QSplashScreen(QPixmap("./jiemian/load.jpg"))
splash.setFont(QFont('Microsoft YaHei UI', 12))
splash.show()
splash.showMessage("正在检测,请稍等……0%", QtCore.Qt.AlignLeft | QtCore.Qt.AlignBottom, QtCore.Qt.black)
time.sleep(2.0) # 模拟运算的时间
splash.showMessage("正在检测,请稍等……30%", QtCore.Qt.AlignLeft | QtCore.Qt.AlignBottom, QtCore.Qt.black)
time.sleep(3.0) # 模拟运算的时间
splash.showMessage("正在检测,请稍等……60%", QtCore.Qt.AlignLeft | QtCore.Qt.AlignBottom, QtCore.Qt.black)
time.sleep(2.0) # 模拟运算的时间
splash.showMessage("正在检测,请稍等……100%", QtCore.Qt.AlignLeft | QtCore.Qt.AlignBottom, QtCore.Qt.black)
str_all = predict.predict_single_person(self.fname, thresh)
self.Infolabel.setText(str(str_all))
# 输出结果图片
img = QtGui.QPixmap('test_result3.jpg').scaled(self.Imglabel.width(), self.Imglabel.height())
self.Imglabel.setPixmap(img)
self.Infolabel_2.setText('文件打开成功\n' + self.fname + '\n' + '结果图片保存至./result/image文件夹\n参数保存至./result/data文件夹')
else:
self.Infolabel_2.setText('未输入图像阈值')
else:
self.fileBtn_2.clicked.connect(self.jinzhi)
if __name__ == '__main__':
app = QApplication(sys.argv)
splash = QSplashScreen(QPixmap("./jiemian/waitting.jpg"))
splash.setFont(QFont('Microsoft YaHei UI', 10))
splash.show()
splash.showMessage("程序初始化中... 0%", QtCore.Qt.AlignLeft | QtCore.Qt.AlignBottom, QtCore.Qt.black)
time.sleep(1.3) # 模拟运算的时间
splash.showMessage("加载配置...60%", QtCore.Qt.AlignLeft | QtCore.Qt.AlignBottom, QtCore.Qt.black)
time.sleep(5.3) # 模拟运算的时间
splash.showMessage("加载配置...100%", QtCore.Qt.AlignLeft | QtCore.Qt.AlignBottom, QtCore.Qt.black)
ui = CamShow()
ui.show()
sys.exit(app.exec_())
# -*- coding: utf-8 -*-
"""---面向过程的编程方式
主要特点:所有代码实现过程都是以“顺序控件”方式执行。
所有的界面和控件都是逐个逐个以代码实现。
主要缺陷:
1)代码冗余,且代码杂乱;
2)代码不宜阅读和修改;
3)可维护性差,比较复杂;
面向过程代码实现GUI的步骤:
1)导入包
2)创建一个应用程序
3)控件操作(创建控件、设置控件、添加子控件、其他(信号、事件、槽))
4)开始执行应用程序,并进入消息循环
下面是一个面向过程的代码例子:
创建一个空界面、一个按钮、一个标签等控件。
--"""
# 导入需要的包
from PyQt5.Qt import *
import sys
# 1、创建一个应用程序
app = QApplication(sys.argv) #创建一个应用程序(比不可少的)
print(app.arguments()) #打印应用程序信息,及文件名['D:/ProgramFiles64/MyCode_Files/Python+PyQT/Qttest01/顶层控件操作.py']
#2、控件操作——创建控件,设置控件(大小、位置、样式...),事件,信号的处理
#2.1 创建控件
window = QWidget()
push = QPushButton(window)
label = QLabel(window)
label.setText("xxxx")
label1 = QLabel(window)
label.setText("xxxx")
label2 = QLabel(window)
label.setText("xxxx")
label3 = QLabel(window)
label.setText("xxxx")
# 2.2 设置控件
window.setWindowTitle("创建一个空白窗口")
window.resize(400,400) #修改窗口大小
push.setWindowTitle("按钮控件")
push.setText("创建一个按钮控件")
label.setWindowTitle("标签控件")
label.setText("创建一个标签控件!")
# 2.3 展示控件
window.show()
push.show()
label.show()
#开始执行应用程序,并进入消息循环
sys.exit(app.exec_())