前言

在PyQt界面开发过程,有时候会遇到界面卡顿情况。经过多次试验,大部分原因是由于界面在进行数据查询过程耗时导致界面卡顿。解决方法建议采用多线程、多进程解决。


一、卡顿模拟

在界面更新函数加入time.sleep(2)即可阻断主界面执行完成,导致卡顿现象

 def say(self,msg):# 主界面更新如果耗时,那么主界面就会出现卡顿现象,下面这一行模拟主界面耗时,注释掉,主界面不会出现卡顿现象time.sleep(3)self.idx += 1self.txtOutput.setText('%s[%d]' % (msg,self.idx)

执行效果如下:

二、具体代码如下

代码名称:UiMain.py

# -*- coding: utf-8 -*-# Form implementation generated from reading ui file '.\UiMain.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_Form(object):def setupUi(self, Form):Form.setObjectName("Form")Form.resize(400, 300)self.gridLayout = QtWidgets.QGridLayout(Form)self.gridLayout.setObjectName("gridLayout")self.label = QtWidgets.QLabel(Form)self.label.setObjectName("label")self.gridLayout.addWidget(self.label, 0, 0, 1, 1)self.lnInput = QtWidgets.QLineEdit(Form)self.lnInput.setObjectName("lnInput")self.gridLayout.addWidget(self.lnInput, 0, 1, 1, 1)self.bntBackupSelect = QtWidgets.QPushButton(Form)self.bntBackupSelect.setObjectName("bntBackupSelect")self.gridLayout.addWidget(self.bntBackupSelect, 0, 2, 1, 1)self.txtOutput = QtWidgets.QTextBrowser(Form)self.txtOutput.setObjectName("txtOutput")self.gridLayout.addWidget(self.txtOutput, 1, 0, 1, 3)self.retranslateUi(Form)QtCore.QMetaObject.connectSlotsByName(Form)def retranslateUi(self, Form):_translate = QtCore.QCoreApplication.translateForm.setWindowTitle(_translate("Form", "Form"))self.label.setText(_translate("Form", "输入信息"))self.bntBackupSelect.setText(_translate("Form", "后台查询"))

代码名称:testThread.py

# -*- coding: utf-8 -*-
import time
import pythoncom
import UiMainfrom PyQt5 import QtCoreclass ThreadCheckAnti(QtCore.QThread):sinOut       = QtCore.pyqtSignal(str) # 自定义信号,执行run()函数时,从相关线程发射此信号def __init__(self,parent=None):super(ThreadCheckAnti, self).__init__(parent)def run(self):pythoncom.CoInitialize()while True:time.sleep(1)self.sinOut.emit('hi')#释放资源pythoncom.CoUninitialize()from PyQt5.QtWidgets import QApplication , QWidget, QMessageBox
class WdtMain(QWidget,UiMain.Ui_Form):def __init__(self, parent=None):super(WdtMain, self).__init__(parent=parent)self.setupUi(self)self.initUI()self.idx = 0def __del__(self):print(self.__class__,'del')#self.thread.stop()def initUI(self):# 菜单模块self.thread = ThreadCheckAnti()self.thread.sinOut.connect(self.say)self.thread.start()#self.openBackRun()def say(self,msg):# 主界面更新如果耗时,那么主界面就会出现卡顿现象,下面这一行模拟主界面耗时,注释掉,主界面不会出现卡顿现象time.sleep(3)self.idx += 1self.txtOutput.setText('%s[%d]' % (msg,self.idx))if __name__=="__main__":import sysapp = QApplication(sys.argv)demo = WdtMain()demo.show()sys.exit(app.exec_())

三、卡顿解决办法

以上案例虽然用到了线程,但是由于主界面的say函数由于比较耗时(2秒完成),而线程执行的速度又是1秒发送一次信号,导致主界面应接不暇。
解决思路:

A 消息驱动机制

say函数与线程互动,线程每次发送一次消息等待say返回信息再执行后续循环。

B 锁机制

say与线程之间共用一个锁,每次线程执行之前加锁,发送完成之后,解锁;say函数修改界面之前加锁,修改完成之后解锁。

以上代码改动如下:

# -*- coding: utf-8 -*-
import time
import pythoncom
import UiMainfrom PyQt5 import QtCore
from PyQt5.QtCore import QMutex
from multiprocessing import Queueclass ThreadCheckAnti(QtCore.QThread):sinOut       = QtCore.pyqtSignal(str) # 自定义信号,执行run()函数时,从相关线程发射此信号def __init__(self,q_msg:Queue,q_lock:QMutex,parent=None):super(ThreadCheckAnti, self).__init__(parent)self.q_msg=q_msgself.q_lock=q_lockdef run(self):pythoncom.CoInitialize()while True:print('thread 准备 加锁...')self.q_lock.lock()print('thread 加锁 成功 ...')time.sleep(1)self.sinOut.emit('hi')self.q_lock.unlock()print('thread 释放锁 ...')# 等待主界面消息print('thread wait msg')msg = self.q_msg.get()print('say 反馈消息:', msg )#释放资源pythoncom.CoUninitialize()from PyQt5.QtWidgets import QApplication , QWidget, QMessageBox
class WdtMain(QWidget,UiMain.Ui_Form):def __init__(self, parent=None):super(WdtMain, self).__init__(parent=parent)self.setupUi(self)self.initUI()self.idx = 0def __del__(self):print(self.__class__,'del')#self.thread.stop()def initUI(self):# 菜单模块self.q_lock=QMutex()self.q_msg =Queue()self.thread = ThreadCheckAnti(q_lock=self.q_lock, q_msg=self.q_msg)self.thread.sinOut.connect(self.say)self.thread.start()#self.openBackRun()def say(self,msg):self.q_lock.lock()# 主界面更新如果耗时,那么主界面就会出现卡顿现象,下面这一行模拟主界面耗时,注释掉,主界面不会出现卡顿现象time.sleep(3)self.idx += 1self.txtOutput.setText('%s[%d]' % (msg,self.idx))self.q_lock.unlock()self.q_msg.put('go')if __name__=="__main__":import sysapp = QApplication(sys.argv)demo = WdtMain()demo.show()sys.exit(app.exec_())

解决效果:主界面在拖动过程不会出现“未响应”提示;由于say中sleep(3)在拖动过程还是会出现卡的感觉,这种是由于主界面是单进程缘故,所以在say执行耗时尽量减少到毫秒级别。

9.PyQt主界面卡顿解决办法相关推荐

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

    参考链接:PyQt - 使用多线程避免界面卡顿_bailang_zhizun的博客-CSDN博客_pyqt界面卡死 代码1: #!/usr/bin/python # coding:UTF-8 from ...

  2. 手机玩html5游戏很卡,手机游戏卡怎么办_手机玩游戏卡顿解决办法-系统城

    现在很多小伙伴在闲暇之余都会使用手机来玩游戏,但有些网友在操作时却遇到了手机玩游戏卡顿的情况,很是影响游戏体验,那对此我们该怎么来处理这一问题呢?今天系统城小编就来为大家分享关于手机玩游戏卡顿解决办法 ...

  3. 【记录】IDEA未正确关闭导致打开报错,进不了主界面,含解决办法

    [记录]IDEA未正确关闭导致打开报错,进不了主界面,含解决办法 错误提示 解决方案 参考 错误提示 截取了错误的主要部分 java.util.concurrent.CompletionExcepti ...

  4. 电脑版 钉钉 卡顿 解决办法

    关于 电脑版 钉钉 卡顿 解决办法 左上角头像->设置-> 关闭 是否开启高清模式.

  5. vue+cesium cesium数据量太大导致浏览器卡顿解决办法

    vue+cesium cesium数据量太大 导致浏览器卡顿 解决办法 解决方案 : 不要把任何的cesium对象 放在data中监听,因为在data中的变量 , vue会劫持数据 , 导致迟缓. 解 ...

  6. NBA2K14之前不卡忽然卡顿解决办法

    NBA2K14之前不卡忽然卡顿解决办法 前言 最近复工回北京,隔离在家学习之余,打开笔记本玩了玩NBA2K14,忽然游戏卡的不行,我的笔记本之前玩还没问题,怎么忽然卡了呐? 解决 因为我电脑是双显卡的 ...

  7. 笔记本电脑和台式机电脑长时间不用后卡顿解决办法

    描述:笔记本电脑和台式机电脑长时间不用后卡顿解决办法 方法: 这是长时间不用,电子元件受潮导致,可以下载一个鲁大师开启温度压力测试,热一会儿机器就好了

  8. 我的世界java版特别卡怎么办_MCjava优化卡顿解决办法?我的世界运行咋办

    我的世界这个游戏看着像素不高,感觉好像要求配置不高,但是游戏的可扩展性很强,玩玩东西多了就会发现运行越来越卡,还有下载材质包和MOD版东西更多,那运行卡顿除了提高电脑配置这个办法外,还能对游戏进行优化 ...

  9. 计算机 蓝牙鼠标卡顿,蓝牙鼠标卡顿不流畅怎么办 最新win10无线鼠标卡顿解决办法...

    电脑蓝牙鼠标卡顿怎么办?蓝牙鼠标越来越受大家的喜欢,但是很多朋友在配置蓝牙鼠标后,蓝牙鼠标在使用时总是有卡顿的现象,严重的影响大家的使用体验,那么怎么才能解决蓝牙鼠标卡顿的问题呢?如果蓝牙鼠标设备是正 ...

  10. cad2014卡顿的解决方法_AutoCAD 2012运行卡顿怎么办-cad卡顿解决办法

    autocad 2012Win32/64 简体中文版 类型:3D 制作大小:1.10G语言:中文 评分:5.1 标签: 立即下载 随着AutoCAD版本的更新,AutoCAD运行时也出现了卡顿的情况. ...

最新文章

  1. js filter 用法
  2. uni-app 使用 web-view 页面之间互相跳转、通信
  3. 非接触物体尺寸形态测量_如何确定接触式和非接触式测量之间的测量技术
  4. 关于快速排序的一些理解
  5. axure日期选择器组件_vue干货分享,超过六种组件通信方法讲解和精髓归纳
  6. 优秀的云存储解决方案Dropbox,现在注册就有2G
  7. css-盒子模型详解以及远视图的制作
  8. 回归预测 基于ELMAN递归神经网络预测及其matlab代码实现
  9. 中文字体下载大全+传世书法墨迹珍藏..等20款
  10. AI近义词替换工具.v.1.2
  11. 【CO2二氧化碳传感器】senseair S8 LP
  12. UE5 虚幻引擎学习资源汇总
  13. docker 分析cpu占用过高
  14. linux 下 `dirname $0`
  15. 二叉树的前序,中序,后序遍历Java实现
  16. 40st-m00330 型伺服电机STM32单片机PWM脉冲控制
  17. SQL条件查询,分组查询,排序查询,分页查询
  18. 人工智能:Django的学习,下象棋的小游戏
  19. 诺基亚:成也塞班 败也塞班
  20. ubuntu AnyDesk的安装与卸载

热门文章

  1. 基于JAVA教材管理系统-计算机毕业设计源码+系统+mysql数据库+lw文档+部署
  2. 如何使用vs将现有的项目或者文件夹(尤其是多层目录的)添加到项目中
  3. VBA: 如何停止当前VBA程序(尤其是死循环)的运行,用程序停止其他程序,暂停程序等(未完成)
  4. JavaScript 课外书
  5. 打造高性能手机贴膜机
  6. Qt设置软件只开启一个,避免重复打开
  7. 2012年美国100家最佳雇主:谷歌登顶
  8. ⚠️ 关于掘金社区 CDN 开启防盗链的公告
  9. Jquery实现在线钢琴
  10. python爬虫自动翻页_python+scrapy爬虫时如何自动翻页获取内容