pyqt 界面卡顿 解决办法 多线程

简介: pyqt 界面卡顿 解决办法 多线程

参考链接:PyQt - 使用多线程避免界面卡顿_bailang_zhizun的博客-CSDN博客_pyqt界面卡死

代码1:

#!/usr/bin/python
# coding:UTF-8
from PyQt5 import QtWidgets, QtCore
import sys
from PyQt5.QtCore import *
import time
# 继承QThread
class Runthread(QtCore.QThread):
    #  通过类成员对象定义信号对象
    _signal = pyqtSignal(str)
    def __init__(self):
        super(Runthread, self).__init__()
    def __del__(self):
        self.wait()
    def run(self):
        for i in range(100):
            time.sleep(0.1)
            self._signal.emit(str(i))  # 注意这里与_signal = pyqtSignal(str)中的类型相同
class Example(QtWidgets.QWidget):
    def __init__(self):
        super(Example, self).__init__()
        # 按钮初始化
        self.button = QtWidgets.QPushButton('开始', self)
        self.button.move(120, 80)
        self.button.clicked.connect(self.start_login)  # 绑定多线程触发事件
        # 进度条设置
        self.pbar = QtWidgets.QProgressBar(self)
        self.pbar.setGeometry(50, 50, 210, 25)
        self.pbar.setValue(0)
        # 窗口初始化
        self.setGeometry(300, 300, 300, 200)
        self.show()
        self.thread = None  # 初始化线程
    def start_login(self):
        # 创建线程
        self.thread = Runthread()
        # 连接信号
        self.thread._signal.connect(self.call_backlog)  # 进程连接回传到GUI的事件
        # 开始线程
        self.thread.start()
    def call_backlog(self, msg):
        self.pbar.setValue(int(msg))  # 将线程的参数传入进度条
if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    myshow = Example()
    myshow.show()
    sys.exit(app.exec_())

代码2:

#!/usr/bin/python
# coding:UTF-8
from PyQt5 import QtWidgets, QtCore
import sys
from PyQt5.QtCore import *
import time
# 继承 QObject
class Runthread(QtCore.QObject):
    #  通过类成员对象定义信号对象
    signal = pyqtSignal(str)
    def __init__(self):
        super(Runthread, self).__init__()
        self.flag = True
    def __del__(self):
        print ">>> __del__"
    def run(self):
        i = 0
        while self.flag:
            time.sleep(1)
            if i <= 100:
                self.signal.emit(str(i))  # 注意这里与_signal = pyqtSignal(str)中的类型相同
                i += 1
        print ">>> run end: "
class Example(QtWidgets.QWidget):
    #  通过类成员对象定义信号对象
    _startThread = pyqtSignal()
    def __init__(self):
        super(Example, self).__init__()
        # 按钮初始化
        self.button_start = QtWidgets.QPushButton('开始', self)
        self.button_stop = QtWidgets.QPushButton('停止', self)
        self.button_start.move(60, 80)
        self.button_stop.move(160, 80)
        self.button_start.clicked.connect(self.start)  # 绑定多线程触发事件
        self.button_stop.clicked.connect(self.stop)  # 绑定多线程触发事件
        # 进度条设置
        self.pbar = QtWidgets.QProgressBar(self)
        self.pbar.setGeometry(50, 50, 210, 25)
        self.pbar.setValue(0)
        # 窗口初始化
        self.setGeometry(300, 300, 300, 200)
        self.show()
        self.myT = Runthread()          # 创建线程对象
        self.thread = QThread(self)     # 初始化QThread子线程
        # 把自定义线程加入到QThread子线程中
        self.myT.moveToThread(self.thread)
        self._startThread.connect(self.myT.run)     # 只能通过信号-槽启动线程处理函数
        self.myT.signal.connect(self.call_backlog)
    def start(self):
        if self.thread.isRunning():     # 如果该线程正在运行,则不再重新启动
            return
        # 先启动QThread子线程
        self.myT.flag = True
        self.thread.start()
        # 发送信号,启动线程处理函数
        # 不能直接调用,否则会导致线程处理函数和主线程是在同一个线程,同样操作不了主界面
        self._startThread.emit()
    def stop(self):
        if not self.thread.isRunning():     # 如果该线程已经结束,则不再重新关闭
            return
        self.myT.flag = False
        self.stop_thread()
    def call_backlog(self, msg):
        self.pbar.setValue(int(msg))  # 将线程的参数传入进度条
    def stop_thread(self):
        print ">>> stop_thread... "
        if not self.thread.isRunning():
            return
        self.thread.quit()      # 退出
        self.thread.wait()      # 回收资源
        print ">>> stop_thread end... "
if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    myshow = Example()
    myshow.show()
    sys.exit(app.exec_())
目录
相关文章
|
定位技术 数据安全/隐私保护 iOS开发
一文讲清楚地图地理坐标系
一文讲清楚地图地理坐标系
1125 0
|
6月前
|
Linux 编译器 开发工具
Linux下Zlib安装与使用教程 (从入门到精通的Zlib压缩库开发指南)
本文参考:http://iyjla.cn详解Linux下Zlib压缩库的安装与使用:涵盖源码下载、编译安装(configure/make/make install)、头文件与库链接,以及基础C程序调用示例,助开发者快速掌握这一通用开源压缩工具。(239字)
|
XML JSON Ubuntu
Python实用记录(十五):PyQt/PySide6打包成exe,精简版(nuitka/pyinstaller/auto-py-to-exe)
本文介绍了使用Nuitka、PyInstaller和auto-py-to-exe三种工具将Python的PyQt/PySide6应用打包成exe文件的方法。提供了详细的安装步骤、打包命令和参数说明,适合新手学习和实践。
8942 0
|
JavaScript 前端开发 数据可视化
20.6K star!Excel级交互体验!这款开源Web表格神器绝了!
Handsontable 是一款功能强大的 JavaScript 数据表格组件,提供类 Excel 的交互体验。支持实时协作、数据绑定、公式计算等企业级功能,可轻松集成到 React/Vue/Angular 等主流框架。
3273 11
|
人工智能 边缘计算 自然语言处理
大模型应用实践:2025年智能语音机器人厂商推荐和方案详解
随着数字化转型加速,AI客服机器人市场规模预计2025年突破500亿美元,年复合增长率超25%。其发展由语音交互升级、垂直场景解决方案成熟及多模态融合与边缘计算普及三大趋势驱动。文章分析了智能语音机器人的选型核心维度,包括技术性能、场景适配、数据治理与成本效益,并对比了国内外代表厂商如合力亿捷、Zendesk等的方案特点,为企业提供选型策略与落地建议,助力实现服务模式的根本性变革。
1388 0
|
C# 开发者 Windows
WPF 应用程序开发:一分钟入门
本文介绍 Windows Presentation Foundation (WPF),这是一种用于构建高质量、可缩放的 Windows 桌面应用程序的框架,支持 XAML 语言,方便 UI 设计与逻辑分离。文章涵盖 WPF 基础概念、代码示例,并深入探讨常见问题及解决方案,包括数据绑定、控件样式与模板、布局管理等方面,帮助开发者高效掌握 WPF 开发技巧。
732 65
Github邮件联系项目源代码作者简单方法
Github邮件联系项目源代码作者简单方法
2955 0
Github邮件联系项目源代码作者简单方法
|
vr&ar 网络架构
|
存储 SQL 测试技术
图书馆管理系统系统分析与设计(下)
图书馆管理系统系统分析与设计(下)
1140 1