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循环继续执行(结束线程)