Sharkkkyu 2024-05-07 17:23 采纳率: 0%
浏览 8

pythonQT执行函数时,窗体卡死

请问大家,我这段代码的意思是,在开启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())



  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-07 17:23
    关注

    引自免费微信小程序:皆我百晓生

    为了防止GUI(主程序)因执行start.py中的死循环而卡死,你需要将start.py的功能放入一个单独的线程中运行。这样可以确保主程序不会被阻塞,同时还能继续响应用户的交互。

    这里是一个修改后的代码示例,展示了如何使用多线程来执行start.py中的功能:

    首先,你需要在Main类中创建一个新的方法来启动线程,并在其中调用start.py中的函数。这里我们假设start.py有一个名为run()的入口点函数。

    import importlib.util
    
    def run_start_thread(self):
        spec = importlib.util.spec_from_file_location("start", "start.py")
        module = importlib.util.module_from_spec(spec)
        spec.loader.exec_module(module)  # Load the module
    
        # Assuming `run` is the entry point function in start.py
        start_run = getattr(module, "run")
    
        # Create a new thread to execute the start.py's run function
        start_thread = Thread(target=start_run)
        start_thread.start()
    
        # Connect this method to your desired button or event trigger
        self.pushButton_20.clicked.connect(self.run_start_thread)
    

    然后,在start.py中,你需要将死循环包装在一个无限循环函数中,以便于控制其运行。例如:

    # start.py
    import time
    
    def run():
        while True:
            process_images()
            time.sleep(interval)  # Replace 'interval' with your desired time interval in seconds
    

    现在,当用户触发特定事件(如点击run_start_thread绑定的按钮)时,将会启动一个新线程来执行start.py中的run()函数。这将允许主程序保持活跃,不会因为执行start.py中的死循环而卡死。

    注意:由于你没有提供start.py的具体内容,所以我假设了一个名为process_images()的函数,以及一个用于指定间隔时间的变量interval。你需要根据实际情况调整这些部分。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月7日

悬赏问题

  • ¥60 微信小程序如何上传QQ聊天文件
  • ¥300 开发的系统遭到无良商家的破解,请问如何防止再次发生,并追回损失
  • ¥15 java代码写在记事本上后在cmd上运行时无报错但又没生成文件
  • ¥15 关于#python#的问题:在跑ldsc数据整理的时候一直抱这种错误,要么--out识别不了参数,要么--merge-alleles识别不了参数(操作系统-linux)
  • ¥15 PPOCRLabel
  • ¥15 混合键合键合机对准标识
  • ¥100 现在不懂的是如何将当前的相机中的照片,作为纹理贴图,映射到扫描出的模型上
  • ¥15 魔霸ROG7 pro,win11.息屏后会显示黑屏,如图,如何解决?(关键词-重新启动)
  • ¥15 有没有人知道这是哪里出了问题啊?要怎么改呀?
  • ¥200 C++表格文件处理-悬赏