一.在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循環繼續執行(結束線程)