请问大家,我这段代码的意思是,在开启gui窗体时,执行另一个start函数,这个start.py的作用是图像处理,yolo算法识别图像,并且写在了死循环中,每到一定的时间间隔就扫描文件夹内的图片进行识别。但是这段代码执行时。会优先执行这个start.py并且导致窗体白屏卡死。请问大家怎么解决呀
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from Ui_interface import *
from Ui_interface2 import *
from start import start
from threading import Thread
import sys
import os
import shutil
import datetime
'''数据库基本连接信息'''
# db = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123456', db='cornpm', charset='utf8')
import pyodbc
db= pyodbc.connect('DRIVER={SQL Server};SERVER=DESKTOP-3FR21NL;DATABASE=CornPM;UID=sa;PWD=yusongmin030912')
class Main(QMainWindow,Ui_MainWindow):
signB = pyqtSignal(list)
def __init__(self, parent = None):
super(Main, self).__init__(parent)
self.setupUi(self)
self.ADDR = 'D:/桌面/mqms_yolov3 (2)/mqms_yolov3/result/unHandled'
'''连接数据库读取数据'''
self.noruser_cur = db.cursor()
self.noruser_sqlstring = "select * from noruser where "
self.noruser_cur.execute("SELECT * FROM noruser")
self.noruser_sql_data = self.noruser_cur.fetchall()
self.picinfo_cur = db.cursor()
self.picinfo_sqlstring = "select * from BlockData where "
self.picinfo_cur.execute("SELECT * FROM BlockData")
self.picinfo_sql_data = self.picinfo_cur.fetchall()
self.picinfo_col_lst = [tup[0] for tup in self.picinfo_cur.description]
self.tableWidget.verticalHeader().setVisible(False) # 隐藏垂直表头
self.tableWidget.horizontalHeader().setDefaultAlignment(Qt.AlignCenter) #表头文字居中
self.tableWidget.horizontalHeader().setStyleSheet("QHeaderView::section{background:rgb(23, 124, 176, 0.8);color: white;}");#设置表头背景和字体颜色
self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) #设置列宽度自适应
self.tableWidget.setRowCount(len(self.picinfo_sql_data))
self.tableWidget.setColumnCount(len(self.picinfo_col_lst)+1)
self.picinfo_col_lst.insert(0,'删除')
self.tableWidget.setHorizontalHeaderLabels(self.picinfo_col_lst)
self.checkBox.stateChanged.connect(self.choose1)
self.checkBox_2.stateChanged.connect(self.choose2)
for i in range(len(self.picinfo_sql_data)):
item = QtWidgets.QTableWidgetItem()
item.setCheckState(QtCore.Qt.Unchecked)
item.setData(1, item.checkState())
self.tableWidget.setItem(i, 0, item)
self.tableWidget.verticalHeader().setVisible(False)
for i in range(len(self.picinfo_sql_data)): #列表中填入响应的值
for j in range(len(self.picinfo_col_lst)-1):
self.tableWidget.setItem(i, j+1, QTableWidgetItem(str(self.picinfo_sql_data[i][j])))
self.tableWidget.item(i, j+1).setTextAlignment(Qt.AlignCenter)
self.plinfo_cur = db.cursor()
self.plinfo_sqlstring = "select * from PLInfo where "
self.plinfo_cur.execute("SELECT * FROM PLInfo")
self.plinfo_sql_data = self.plinfo_cur.fetchall()
self.plinfo_col_lst = [tup[0] for tup in self.plinfo_cur.description]
# print(self.plinfo_sql_data)
self.tableWidget_2.verticalHeader().setVisible(False) # 隐藏垂直表头
self.tableWidget_2.horizontalHeader().setDefaultAlignment(Qt.AlignCenter) #表头文字居中
self.tableWidget_2.horizontalHeader().setStyleSheet("QHeaderView::section{background:rgb(23, 124, 176, 0.8);color: white;}");#设置表头背景和字体颜色
self.tableWidget_2.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) #设置列宽度自适应
self.tableWidget_2.setRowCount(len(self.plinfo_sql_data))
self.tableWidget_2.setColumnCount(len(self.plinfo_col_lst)+1)
self.plinfo_col_lst.insert(0,'删除')
self.tableWidget_2.setHorizontalHeaderLabels(self.plinfo_col_lst)
for i in range(len(self.picinfo_sql_data)):
item = QtWidgets.QTableWidgetItem()
item.setCheckState(QtCore.Qt.Unchecked)
item.setData(1, item.checkState())
self.tableWidget_2.setItem(i, 0, item)
self.tableWidget_2.verticalHeader().setVisible(False)
for i in range(len(self.plinfo_sql_data)): #列表中填入响应的值
for j in range(len(self.plinfo_col_lst)-1):
self.tableWidget_2.setItem(i, j+1, QTableWidgetItem(str(self.plinfo_sql_data[i][j])))
self.tableWidget_2.item(i, j+1).setTextAlignment(Qt.AlignCenter)
#按钮组件(重置)
self.pushButton_5.clicked.connect(self.Login) #点击登录
self.pushButton_2.clicked.connect(self.MainPage2) #页面跳转
self.pushButton_3.clicked.connect(self.MainPage3)
self.pushButton_4.clicked.connect(self.MainPage1)
self.tableWidget_2.itemDoubleClicked.connect(self.interface2)
self.pushButton_6.clicked.connect(self.delete1) #删除第一个表格数据
self.pushButton_8.clicked.connect(self.delete2) #删除第二个表格数据
self.pushButton_18.clicked.connect(self.choose) #选择图片
self.pushButton_19.clicked.connect(self.shangchuan) #上传图片
self.pushButton_20.clicked.connect(self.re_) #重新执行
self.pushButton_9.clicked.connect(self.check2) #搜索
self.pushButton_7.clicked.connect(self.check) #搜索
self.pushButton_11.clicked.connect(self.gotoregister) #注册页面
self.pushButton_16.clicked.connect(self.BacktoIndex) #返回
self.pushButton_15.clicked.connect(self.register) #注册
self.pushButton_2.setEnabled(False)
self.pushButton_3.setEnabled(False)
self.pushButton_4.setEnabled(False)
self.pushButton_12.setEnabled(False)
########################################################################
## #界面跳转逻辑
def Login(self):
stand = 0
flag = 0
for i in range(len(self.noruser_sql_data)): #判断是否符合账号密码,符合则跳转界面,否则弹出提示
if self.lineEdit.text() == str(self.noruser_sql_data[i][2]) and self.lineEdit_2.text() == str(self.noruser_sql_data[i][3]):
flag = i
stand = 1
# print(self.noruser_sql_data[i][2])
# print(self.noruser_sql_data[i][3])
if stand == 1:
self.stackedWidget.setCurrentIndex(1)
self.pushButton_2.setEnabled(True)
self.pushButton_3.setEnabled(True)
self.pushButton_4.setEnabled(True)
self.pushButton_12.setEnabled(True)
self.label_3.setText("欢迎用户:"+self.noruser_sql_data[flag][2])
else:
self.reply = QMessageBox.warning(self, "提示", "用户名或密码错误")
def MainPage2(self):
self.plinfo_cur.execute("SELECT * FROM PLInfo")
self.plinfo_sql_data = self.plinfo_cur.fetchall()
self.tableWidget_2.setRowCount(len(self.plinfo_sql_data))
for i in range(len(self.picinfo_sql_data)):
item = QtWidgets.QTableWidgetItem()
item.setCheckState(QtCore.Qt.Unchecked)
item.setData(1, item.checkState())
self.tableWidget_2.setItem(i, 0, item)
self.tableWidget_2.verticalHeader().setVisible(False)
for i in range(len(self.plinfo_sql_data)): #列表中填入响应的值
for j in range(len(self.plinfo_col_lst)-1):
self.tableWidget_2.setItem(i, j+1, QTableWidgetItem(str(self.plinfo_sql_data[i][j])))
self.tableWidget_2.item(i, j+1).setTextAlignment(Qt.AlignCenter)
self.stackedWidget.setCurrentIndex(2)
def MainPage1(self):
self.picinfo_cur.execute("SELECT * FROM BlockData")
self.picinfo_sql_data = self.picinfo_cur.fetchall()
self.tableWidget.setRowCount(len(self.picinfo_sql_data))
self.checkBox.stateChanged.connect(self.choose1)
self.checkBox_2.stateChanged.connect(self.choose2)
for i in range(len(self.picinfo_sql_data)):
item = QtWidgets.QTableWidgetItem()
item.setCheckState(QtCore.Qt.Unchecked)
item.setData(1, item.checkState())
self.tableWidget.setItem(i, 0, item)
self.tableWidget.verticalHeader().setVisible(False)
for i in range(len(self.picinfo_sql_data)): #列表中填入响应的值
for j in range(len(self.picinfo_col_lst)-1):
self.tableWidget.setItem(i, j+1, QTableWidgetItem(str(self.picinfo_sql_data[i][j])))
self.tableWidget.item(i, j+1).setTextAlignment(Qt.AlignCenter)
self.stackedWidget.setCurrentIndex(1)
def MainPage3(self):
self.stackedWidget.setCurrentIndex(3)
def gotoregister(self):
self.stackedWidget.setCurrentIndex(4)
# print("gotoregister has been used")
def register(self):
legal = 0 #注册填表合法性
# print("register has been used")
if self.lineEdit_13.text() == self.lineEdit_14.text() and self.lineEdit_13.text() != "" and self.lineEdit_12.text()!= "":
legal = 1
elif self.lineEdit_13.text() == "" or self.lineEdit_12.text() == "":
legal = 0
QMessageBox.warning(self,"提示","用户名或密码不能为空")
else:
legal = 0
QMessageBox.warning(self,"提示","两次密码输入不一致")
# print(legal)
if legal == 1:
repeat = 0 #用户名重复
for i in range(len(self.noruser_sql_data)):
if self.lineEdit_12.text() == str(self.noruser_sql_data[i][2]):
repeat = 1
QMessageBox.warning(self,"提示","用户名已经存在")
if repeat == 0:
sql = "INSERT INTO NorUser (Name, userpass) VALUES('%s','%s')" % (str(self.lineEdit_12.text()),str(self.lineEdit_13.text()))
# print(sql)
self.noruser_cur.execute(sql)
db.commit()
QMessageBox.information(self,"成功","注册成功",QMessageBox.Yes)
self.stackedWidget.setCurrentIndex(0)
self.noruser_cur.execute("SELECT * FROM NorUser")
self.noruser_sql_data = self.noruser_cur.fetchall()
def BacktoIndex(self):
self.stackedWidget.setCurrentIndex(0)
self.lineEdit_12.setText("")
self.lineEdit_13.setText("")
self.lineEdit_14.setText("")
def interface2(self, Item=None):
row_2 = self.tableWidget_2.currentRow() #当前行
self.ID_stand = row_2
try:
value_lst1 = [self.tableWidget_2.item(row_2, 2).text(),self.tableWidget_2.item(row_2, 1).text(),
self.tableWidget_2.item(row_2, 4).text(), self.tableWidget_2.item(row_2, 3).text()] #图像编号,种类,地点,时间
self.signB.emit(value_lst1)
A1.signA.connect(self.A1reaction) #传输数据
A1.show()
except Exception as e:
print(e)
def A1reaction(self, k): #时间,品种,地址
# self.tableWidget_2.setItem(self.ID_stand, 5, QTableWidgetItem(str(k[0])))
# self.tableWidget_2.setItem(self.ID_stand, 3, QTableWidgetItem(str(k[1])))
self.tableWidget_2.setItem(self.ID_stand, 4, QTableWidgetItem(str(k[2])))
# self.tableWidget_2.item(self.ID_stand, 5).setTextAlignment(Qt.AlignCenter)
# self.tableWidget_2.item(self.ID_stand, 3).setTextAlignment(Qt.AlignCenter)
self.tableWidget_2.item(self.ID_stand, 4).setTextAlignment(Qt.AlignCenter)
row = self.tableWidget_2.currentRow() #当前行
sql = "UPDATE PLInfo SET PLAddr='%s' WHERE ID=%d;" % (str(k[2]),int(k[1]))
# print(sql)
self.noruser_cur.execute(sql)
# self.plinfo_cur.execute("REPLACE INTO PLinfo VALUES (%s,%s,%s,%s,%s)",value_lst) #插入语句(插入到数据库中)
db.commit()
QMessageBox.information(self, "成功", "提交成功", QMessageBox.Yes)
A1.close()
A1.signA.disconnect()
def choose1(self):
if self.checkBox.isChecked():
for i in range(self.tableWidget.rowCount()):
item = QtWidgets.QTableWidgetItem()
item.setCheckState(QtCore.Qt.Checked)
item.setData(1, item.checkState())
self.tableWidget.setItem(i, 0, item)
else:
for i in range(self.tableWidget.rowCount()):
item = QtWidgets.QTableWidgetItem()
item.setCheckState(QtCore.Qt.Unchecked)
item.setData(1, item.checkState())
self.tableWidget.setItem(i, 0, item)
def choose2(self):
if self.checkBox_2.isChecked():
for i in range(self.tableWidget_2.rowCount()):
item = QtWidgets.QTableWidgetItem()
item.setCheckState(QtCore.Qt.Checked)
item.setData(1, item.checkState())
self.tableWidget_2.setItem(i, 0, item)
else:
for i in range(self.tableWidget_2.rowCount()):
item = QtWidgets.QTableWidgetItem()
item.setCheckState(QtCore.Qt.Unchecked)
item.setData(1, item.checkState())
self.tableWidget_2.setItem(i, 0, item)
def check2(self):
print(self.plinfo_sql_data)
Start = self.lineEdit_5.text()+self.comboBox_5.currentText()+self.comboBox_5.currentText()
End = self.lineEdit_7.text()+self.comboBox_7.currentText()+self.comboBox_8.currentText()
Start_time = int(Start)
End_time = int(End)
self.tableWidget_2.setRowCount(0)
self.plinfo_cur.execute("SELECT * FROM PLInfo")
self.plinfo_sql_data = self.plinfo_cur.fetchall()
M = ''.join(self.plinfo_sql_data[0][2].split('-'))
for i in range(len(self.plinfo_sql_data)):
if int(M) < End_time and int(M) > Start_time:
row = self.tableWidget_2.rowCount() #获取行数
self.tableWidget_2.insertRow(row) #在末尾插入一空行
item = QtWidgets.QTableWidgetItem()
item.setCheckState(QtCore.Qt.Unchecked)
item.setData(1, item.checkState())
self.tableWidget_2.setItem(i, 0, item)
for j in range(len(self.plinfo_col_lst)-1):
self.tableWidget_2.setItem(i, j+1, QTableWidgetItem(str(self.plinfo_sql_data[i][j])))
self.tableWidget_2.item(i, j+1).setTextAlignment(Qt.AlignCenter)
def check(self):
Start = self.lineEdit_3.text()+self.comboBox.currentText()+self.comboBox_2.currentText()
End = self.lineEdit_4.text()+self.comboBox_4.currentText()+self.comboBox_3.currentText()
Start_time = int(Start)
End_time = int(End)
self.tableWidget.setRowCount(0)
self.picinfo_cur.execute("SELECT * FROM BlockData")
self.picinfo_sql_data = self.picinfo_cur.fetchall()
print(self.picinfo_sql_data)
M = ''.join(self.picinfo_sql_data[0][14].split('-'))
for i in range(len(self.picinfo_sql_data)):
if int(M) < End_time and int(M) > Start_time:
row = self.tableWidget.rowCount() #获取行数
self.tableWidget.insertRow(row) #在末尾插入一空行
item = QtWidgets.QTableWidgetItem()
item.setCheckState(QtCore.Qt.Unchecked)
item.setData(1, item.checkState())
self.tableWidget.setItem(i, 0, item)
for j in range(len(self.picinfo_col_lst)-1):
self.tableWidget.setItem(i, j+1, QTableWidgetItem(str(self.picinfo_sql_data[i][j])))
self.tableWidget.item(i, j+1).setTextAlignment(Qt.AlignCenter)
def delete1(self):
Num = self.tableWidget.rowCount()
for i in range(Num):
try:
if self.tableWidget.item(Num-1-i,0).checkState() == 2:
del_d = self.tableWidget.item(Num-1-i, 1).text()
# del_d1 = del_d.strip()
print(del_d)
sql = "DELETE FROM BlockData WHERE 序号 = '%s'" % del_d
print(sql)
self.picinfo_cur.execute(sql)
db.commit()
# del_d_2 = self.tableWidget_2.item(Num-1-i, 5).text()
self.tableWidget.removeRow(Num-1-i)#删除表格
except:
pass
def delete2(self):
Num = self.tableWidget_2.rowCount()
for i in range(self.tableWidget_2.rowCount()):
try:
if self.tableWidget_2.item(Num-1-i,0).checkState() == 2:
del_d = self.tableWidget_2.item(Num-1-i, 1).text()
# print(del_d)
sql ="DELETE FROM PLInfo WHERE ID = '" + del_d + "'"
print(sql)
self.plinfo_cur.execute(sql)
db.commit()
self.tableWidget_2.removeRow(Num-1-i)#删除表格
except:
pass
def shangchuan(self):
# try:
# print(self.lineEdit_8.text(), len(self.fileName), len(self.PLACE))
if int(self.lineEdit_8.text()) == len(self.fileName) and int(self.lineEdit_8.text()) == len(self.PLACE):
dst_dir = self.ADDR # 目标路径记得加斜杠 another/
for i in range(len(self.fileName)):
self.mycopyfile(self.fileName[i], dst_dir, self.PLACE[i])
else:
self.reply = QMessageBox.question(self, "提示", "图片数量不符", QMessageBox.Yes | QMessageBox.No , QMessageBox.Yes )
# except pyodbc.Error as e:
# print(e)
def choose(self):
try:
fileName, filetype = QFileDialog.getOpenFileNames(self, "选择文件", "/", "Text Files (*.jpg);;Files (*.gif)")
self.fileName = fileName
dizhi = fileName[0]
for i in range(len(fileName)-1):
dizhi = dizhi + ';'+ fileName[i+1]
self.lineEdit_9.setText(dizhi)
self.Time = self.lineEdit_10.text() #时间
self.PLACE = self.textEdit.toPlainText().split(',') #地址
except:
pass
def re_(self):
self.lineEdit_8.setText('')
self.lineEdit_9.setText('')
self.textEdit.setText('')
self.lineEdit_10.setText('')
def myfunc(self):
start()
def mycopyfile(self, srcfile,dstpath, dizhi): # 复制函数
fname = str(srcfile).split('/')[-1]
# print(dstpath + fname)
file_path=os.path.join(dstpath , fname)
srcfile=os.path.join(srcfile)
shutil.copy(srcfile, file_path) # 复制文件
row = self.tableWidget_2.rowCount() #获取行数
self.tableWidget_2.insertRow(row) #在末尾插入一空行
print(row)
item = QtWidgets.QTableWidgetItem()
item.setCheckState(QtCore.Qt.Unchecked)
item.setData(1, item.checkState())
self.tableWidget_2.setItem(row, 0, item)
# A = function() #返回品种信息
A = 1
self.tableWidget_2.setItem(row, 1, QTableWidgetItem(str(row))) #序号
self.tableWidget_2.item(row, 1).setTextAlignment(Qt.AlignCenter)
self.tableWidget_2.setItem(row, 2, QTableWidgetItem(str(fname))) #图像编号
self.tableWidget_2.item(row, 2).setTextAlignment(Qt.AlignCenter)
self.tableWidget_2.setItem(row, 3, QTableWidgetItem(str(A))) #种类
self.tableWidget_2.item(row, 3).setTextAlignment(Qt.AlignCenter)
self.tableWidget_2.setItem(row, 4, QTableWidgetItem(str(dizhi))) #地址
self.tableWidget_2.item(row, 4).setTextAlignment(Qt.AlignCenter)
start_date = datetime.datetime.strptime(str(self.Time), "%Y-%m-%d")
self.tableWidget_2.setItem(row, 5, QTableWidgetItem(str(self.Time))) #时间
# self.tableWidget_2.item(row, 5).setTextAlignment(Qt.AlignCenter)
value_lst = [str(row+1), str(fname), str(A), str(dizhi), start_date]
sql = "INSERT INTO PLInfo (ID,Variety,PLDate,PLAddr) VALUES('%s','%s','%s','%s')" % (str(row+1),str(fname), str(start_date),str(dizhi))
print(sql)
sql2 = "SET IDENTITY_INSERT PLInfo ON"
self.noruser_cur.execute(sql2)
self.noruser_cur.execute(sql)
# self.plinfo_cur.execute("INSERT INTO PLInfo (ID,Variety,PLDate,PLAddr) VALUES (%s,%s,%s,%s,%s)',value_lst) #插入语句(插入到数据库中)
# sql = "INSERT INTO NorUser (Name, userpass) VALUES('%s','%s')" % (str(self.lineEdit_12.text()), str(self.lineEdit_13.text()))
db.commit()
# A = function() #第二个函数,返回其他信息
# pic_num = fname #图像编号
# hang = 1 #行号
# lie = 1 #列号
# miao = 1 #苗数
# chuya = 1 #出芽率
# pingjun = 1 #平均株距
# zhucha = 1 #株距方差
# fangcha = 1 #平均方差
# mianji = 1 #平均面积
# zhanbi = 1 #面积占比
# yechang = 1 #平均叶长
# yecha = 1 #叶长方差
# midu = 1 #种植密度
# shijian = start_date #处理时间
# value_lst2 = [str(row+1), str(pic_num), str(hang), str(lie), str(miao), str(chuya), str(pingjun),str(zhucha),
# str(fangcha), str(mianji), str(zhanbi), str(yechang), str(yecha), str(midu), str(shijian)]
# self.picinfo_cur.execute("REPLACE INTO picinfo VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)",value_lst2) #插入语句(插入到数据库中)
db.commit()
#############################################################
class A1(QMainWindow, Ui_MainWindow1): #数据操作窗口
signA = pyqtSignal(list)
def __init__(self, parent = None):
super(A1, self).__init__(parent)
self.setupUi(self)
self.ADDR = 'D:/桌面/mqms_yolov3 (2)/mqms_yolov3/result/Handled/'
Main.signB.connect(self.B1reaction) #传输数据
self.pushButton.clicked.connect(self.xiugai)
self.pushButton_2.clicked.connect(self.clear)
def xiugai(self):
value_lst1 = [self.label_4.text(), self.lineEdit_2.text(), self.textEdit.toPlainText()] #时间,品种,地址
self.signA.emit(value_lst1)
def clear(self):
self.lineEdit.setText('')
self.lineEdit_2.setText('')
self.textEdit.setText('')
self.lineEdit_3.setText('')
def B1reaction(self, kk): #图像编号,种类,地点,时间
self.label_4.setText(kk[3])
self.lineEdit_2.setText(kk[1])
self.textEdit.setPlainText(kk[2])
foldername = kk[0].split('.')[0]
road = self.ADDR + foldername +'/'+'res.jpg'
pixmap = QPixmap(road).scaled(800, 500)
self.label_2.setPixmap(pixmap)
if __name__ == "__main__":
app = QApplication(sys.argv)
Main = Main()
A1 = A1()
Main.show()
sys.exit(app.exec())