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

 

转载于:https://www.cnblogs.com/gaoyukun/p/9497813.html

PyQt5 UI 界面分为多线程任务可以通过使用 Python 的 `threading` 模块来实现。以下是一个简单的示例代码,演示了如何在 PyQt5 应用程序中使用多线程任务: ```python import sys import time import threading from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel class MainWindow(QMainWindow): def __init__(self): super().__init__() self.label = QLabel('Waiting for task to finish...', self) self.setCentralWidget(self.label) self.thread = threading.Thread(target=self.do_task) self.thread.start() def do_task(self): time.sleep(5) # 模拟耗时任务 self.label.setText('Task is finished.') if __name__ == '__main__': app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_()) ``` 在上面的示例代码中,我们创建了一个 `MainWindow` 类,它继承自 `QMainWindow`。在 `MainWindow` 的构造函数中,我们创建了一个 `QLabel` 对象,并将其设置为中心窗口小部件。然后,我们创建了一个新的线程对象,并将其目标设置为 `do_task` 方法。最后,我们启动线程。 在 `do_task` 方法中,我们模拟了一个耗时任务,即睡眠了 5 秒钟,然后将标签文本设置为“任务已完成”。 当我们运行这个示例代码时,我们会看到一个窗口出现,上面显示着“等待任务完成”的文本。然后,5 秒钟后,文本变为“任务已完成”。在这个过程中,我们的应用程序仍然可以响应用户的输入,因为任务正在另一个线程中运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值