pyqt界面卡頓問題and退出線程


一.在pyqt中,經常會出現界面卡頓的現象,退出不了,拖動不了等等情況。原因之一是線程阻塞.

解決方法:新建一個線程,將主要代碼邏輯放在新建的線程中。

from PyQt5.QtCore import *  
from PyQt5.QtGui import *  
from PyQt5.QtWidgets import *
import sys

class Example(QWidget):

    def __init__(self):
        super().__init__()
        self.t = 0
        window = QWidget()
        vbox = QVBoxLayout(window)
        #vbox = QVBoxLayout(window)

        self.lcdNumber = QLCDNumber()
        button = QPushButton("測試")
        vbox.addWidget(self.lcdNumber)
        vbox.addWidget(button)

        self.timer = QTimer()
        
        button.clicked.connect(self.work)               ###########################
        self.timer.timeout.connect(self.counttime)      ###########################定時器超出此時間就觸發信號

        self.setLayout(vbox)
        self.show()

    def CountTime(self):
        self.t += 1
        self.lcdNumber.display(self.t)

    def Work(self):
        self.timer.start(1000)
        self.thread = RunThread()                       #
        self.thread.start()                             #啟動線程
        self.thread.trigger.connect(self.TimeStop)      #一旦線程中信號傳來,就執行TimeStop函數

    def TimeStop(self):
        self.timer.stop()
        print("運行結束用時",self.lcdNumber.value())
        self.t = 0
        

class RunThread(QThread):

    trigger = pyqtSignal()            #新建一個信號
 
    def __init__(self, parent=None):
        super(RunThread, self).__init__()
    def run(self):  #重寫run函數
        # 這里寫主要邏輯,如下面for循環例子
        #
        # 
        for i in range(203300030):  
            pass  
        self.trigger.emit()            #一旦for循環執行完,就觸發這個信號  
        # self._signal.emit(msg)      

if __name__ == "__main__":
    app = QApplication(sys.argv)
    th = Example()
    sys.exit(app.exec_())

二.線程的退出

####設置標識符
class WorkThread(QThread,Ui_MainWindow,QtWidgets.QWidget):
    trigger=pyqtSignal()
    def __init__(self):
        super(WorkThread,self).__init__()
        self.flag=1
    def run(self):                                 #重寫run方法
        while p.poll() is None and self.flag==1:
            pass
        else:
            #此時改變self.flag的值,是為了不讓while循環繼續執行(結束線程)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM