PyQt5 界面显示无响应

在GUI程序中,主线程也叫GUI线程,因为它是唯一被允许执行GUI相关操作的线程。对于一些耗时的操作,如果放在主线程中,就是出现界面无法响应的问题。

界面假死分析

在编写QT的界面程序时,当我们调用QApplication.exec()时,我们就启动了QT的事件循环。在开始的时候,QT会发出一些事件来显示和绘制窗口部件。在这之后,事件循环就开始运行,不断地检查是不是有事件发生并且把这些事件发送给应用程序中的QObject。

当一个事件被处理时,其他事件也可能会产生并且追加到QT的事件队列中。如果我们在处理一个特定的事件上耗费过多的时间,用户界面就会变得不能够响应。例如在OCS保存一个观测流程的过程中,一直到文件保存完毕,窗口系统产生的一些事件才会被处
理。在保存过程中,这个应用程序就不能响应窗口系统的请求来重绘自己。

解决方法

  • 方式一使用多线程:一个处理应用程序用户界面的线程,另外一个执行文件保存的线程。
  • 方法二:调用QApplication.processEvents()

博主推荐使用第二种方法,该方法是在事件处理程序中调用QApplication.processEvents()。

这个函数告诉QT处理来处理任何没有被处理的事件,并且将控制权返回给调用者。实际上,QApplication.exec()就是一个不停调用QApplication.processEvents()函数的小while循环。这种方式的危险性在于,也许用户在观测流程未保存好之前就关闭了主窗口,或者在界面上通过鼠标或键盘执行了其它的输入,以至于观测流程未保存好就企图被程序使用。对于这个问题的解决办法是把 qApp -> processEvents(); 替换为 qApp -> eventLoop() -> processEvents( QEventLoop::ExcludeUserInput ); 通过这个调用告诉QT忽略鼠标和键盘事件。

    ...def downfile(self,file, url):print("开始下载:", file, url)try:r = requests.get(url, stream=True)with open(file, 'wb') as fd:for chunk in r.iter_content():fd.write(chunk)QApplication.processEvents()except Exception as e:print("下载失败了", e)...

------------------------------------------补充一下方法一--------------------------》》》》》

说实话快有大半年没怎么使用过python了,关于多线程的处理方式,解释可能不是那么清楚。(目前是一个phper,上半年基本是补PHP方面的基础知识,也就是够用还不精通的一个状态)

先上一个半年前的小作品,是关于微信公众号方面的一些。

这里就不谈用途与使用方法了,大概的讲一下,遇到界面假死的处理方法之一。话不多说,先上代码

from PyQt5.QtCore import QThread, pyqtSignalclass interface(QMainWindow, Ui_MainWindow):"""Class documentation goes here."""def xxxx():"此处省略无数行代码......"self.Work()def Work(self):self.thread = RunThread()self.thread.start()class RunThread(QThread):# python3,pyqt5与之前的版本有些不一样#  通过类成员对象定义信号对象# _signal = pyqtSignal(str)trigger = pyqtSignal()def __init__(self, parent=None):super(RunThread, self).__init__()def __del__(self):self.wait()def run(self):# 处理你要做的业务逻辑,这里是通过一个回调来处理数据,这里的逻辑处理写自己的方法dlg.Config['user'] = dlg.check_account['account']dlg.Config['passwd'] = dlg.check_account['password']dlg.Config['jk'] = 'http://xxx.com'if dlg.num != 1:dlg.operato.config_item(dlg.Config, dlg.wx_update)  # 初始化配置else:dlg.operato.config_item(dlg.Config, dlg.wx_create)  # 初始化配置self.trigger.emit()

说实话还是蛮喜欢python的这种简洁的写法的,所以在很长的一段时间里,一直是比较注重代码的简洁度与良好的注释。em...,不过在其它语言中很难保持这种初心,现在是比较注重性能,响应时间,并发、安全等问题。

这里的interface是主窗口类,如果想在自己的窗口中实现,加一个RunThread类,并在主窗口中定义一个函数,用于调用Work类方法就可以了。通过代码可以看到,不到50行的代码就实现了方法一中的功能了。pyqt5有很多自己的方法,包括多线程等等。这里提供的是一种思路。当然还有很多种方式实现,大家可以去探索一下,好的方法可以一起分享讨论。

========================================7月24号更新=================================

先放一个效果图,

正常情况下会将一些耗时函数扔进Qthread线程中来避免页面假死的情况。

但并不是所有的都是行的通的,

当使用异步协程的时候,pyqt5推荐的是使用quamash

import sys
import asyncio
import timefrom PyQt5.QtWidgets import QApplication, QProgressBar
from quamash import QEventLoop, QThreadExecutorapp = QApplication(sys.argv)
loop = QEventLoop(app)
asyncio.set_event_loop(loop)  # NEW must set the event loopprogress = QProgressBar()
progress.setRange(0, 99)
progress.show()async def master():await first_50()with QThreadExecutor(1) as exec:await loop.run_in_executor(exec, last_50)# TODO announce completion?async def first_50():for i in range(50):progress.setValue(i)await asyncio.sleep(.1)def last_50():for i in range(50,100):loop.call_soon_threadsafe(progress.setValue, i)time.sleep(.1)with loop: ## context manager calls .close() when loop completes, and releases all resourcesloop.run_until_complete(master())

还有一种情况,就是在UI主线程中执行,需要注意的是,如果是耗时任务则会造成界面的卡死,并不大友好。

PyQt5 界面显示无响应相关推荐

  1. python PyQt5程序运行界面无响应

    写在前面 此文档仅记录本人遇到的问题及解决办法,并非涵盖所有 最近写一个股价监控小程序,在改进为界面程序后,每次运行到耗时方法时界面就卡死,无响应,花费了很长事件才把问题解决了,记录一下 原因分析 程 ...

  2. python(pyqt5)多线程解决界面无响应

    多线程解决界面无响应多线程解决界面无响应多线程解决界面无响应 def open_train_task():import osos.system(r"E:\kg\TURN-TAP-master ...

  3. pyqt designer connect无响应_如何用PyQt编写桌面程序,创建并打开播放列表?

    由于电脑上的短视频太多了,并且分别存放在各个子目录下,每次更新后想要整理视频比较麻烦,因此想用Python编写程序来辅助管理视频文件.其实写个Python脚本程序即可实现大器的需求,但为了多练习PyQ ...

  4. Ubuntu16.04 下的网易云出现网络异常、无法播放,界面无响应问题的统一解决

    能够在Linux系统下体验到原生界面的网易云音乐是件不错的事情,但是它总是经常性的出现网络异常,界面无响应的问题 为了听歌的体验,进行深入探究: 首先通过终端启用网易云音乐:sudo netease- ...

  5. 在ESXi主机上关闭无响应的虚拟机

    适用情况 该方法适用于以下情况: ESXi主机上的虚拟机不能关闭. 虚拟机无响应且不能停止. 目的 这篇文章描述在ESXi环境中如何正确的关闭一台无响应的虚拟机. 注意: 这篇文章只适用于ESXi主机 ...

  6. eclipse打开处于无响应状态解决办法

    eclipse打开后处于无响应状态,变没有了反映,并且cup占用率为0.应该是非正常关机导致eclipse工作区的文件状态错误导致. 解决方案:在工作区目录中,有一个.metadata目录,里面是工作 ...

  7. 插入u盘计算机未响应,win7系统插入u盘死机怎么办|win7插入u盘无响应的解决方法...

    ‍‍ 最近有些win7旗舰版用户遇到u盘插入计算机后会出现未响应导致系统死机,虽然等一会儿就能恢复正常,但是每次插入u盘都要卡一下决对是有问题的.遇到在win7系统插入u盘死机怎么办呢?会出现插入u盘 ...

  8. 同在服务器无响应,全部服务器无响应!!!

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 谁来救救我哦!!!! 09/24/06 14:05:42: 正在连接到BiG BanG 9(80.239.200.108:3000)... 09/24/0 ...

  9. 转转服务器无响应,【转】服务器无响应(或者本地MySQL服务器的套接字没有正确配置)的问题...

    服务器无响应(或者本地MySQL服务器的套接字没有正确配置)的问题 第一种情况:(深度清理垃圾导致host.MYD丢失) 跟很多网友一样!用wamp(或xampp.speedphp)可以很容易在自己的 ...

最新文章

  1. [svc]gns3模拟器及探讨几个bgp问题
  2. C++ 发手机短信(很易很简单)
  3. 关于unityengine.dll, unityengine.coremodule.dll
  4. 使用java进行婚礼庆祝_#102030:在30天内运行20 10K,庆祝Java 20年
  5. mysql 的标识符_MySQL查询或标识符在Jupyter中太长?
  6. linux基础(四)——任务调度cron和anacron
  7. java 菜刀_Java中国菜刀(Cknife)的模拟终端乱码解决方法 | 【韩涛博客】
  8. 30个非常有趣的404错误页面设计欣赏
  9. 【中级计量经济学】Lecture 9 面板数据模型
  10. 最新最全MTK联发科手机芯片型号及参数汇总
  11. 数梦工场:我们帮你实现你驾驭数据的梦想
  12. Java8 使用 stream().sorted()对List集合进行排序
  13. 万字长文细说 Code Review 的正确姿势
  14. 软件测试职业发展三步曲之一 - 软件测试职业发展方向
  15. RDKit 操作分子对象
  16. [渝粤教育] 西南科技大学 法律文书写作 在线考试复习资料
  17. CAD高版本转低版本怎么转?分享几种好用的转换方法
  18. 黑苹果 MSI B360迫击炮 i5 8500 hdmi输出 bug处理
  19. sklearn降维算法:PCA、LDA、MDS、流形学习Isomap
  20. Java学习笔记(第二周)

热门文章

  1. 图像处理学习笔记-05-图像复原与重建1
  2. 成都华为OD面试(补充中)
  3. 2019微软Power BI 每月功能更新系列——2月Power BI 新功能学习
  4. 前端基础(十一、JS 输出、变量、基本数据类型)
  5. spark集群环境下Lost task 0.0 in stage 10.0 (TID 17, 10.28.23.202): java.io.FileNotFoundException
  6. 如何正确开展网络口碑营销?
  7. 设置网络唤醒电脑(WAKE ON LAN,WOL)
  8. MySQL 之全文索引--fulltext
  9. 一根木棍随机折成三段,能组成三角形的概率多大?
  10. 运营商大数据如何应用?优势有哪些?