解决PyQt界面阻塞卡死问题

这篇具有很好参考价值的文章主要介绍了解决PyQt界面阻塞卡死问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

任何同学在使用类似PyQt(或者C#开发winform,WPF)开发带界面的软件的刚开始阶段,都会碰到界面卡死软件崩溃的问题。

就比如以下这段代码

import sys

from PyQt5.Qt import *

import time


class Window(QWidget):

    def __init__(self):
        super().__init__()  
        self.setWindowTitle("更新界面案例")
        self.resize(300, 200)
        self.move(400, 250)

    def setup_ui(self):
        self.label = QLabel(self)
        self.label.setText("当前人数: 100")
        self.label.move(100, 50)

        self.btn1=QPushButton(self)
        self.btn1.setText("按钮1")
        self.btn1.move(50,125)
        self.btn1.clicked.connect(self.btn1_method)

        self.btn2=QPushButton(self)
        self.btn2.setText("按钮2")
        self.btn2.move(165,125)
    

    def btn1_method(self):
        
        # 以下为一通耗时操作,比如查询数据库
        time.sleep(10)

        #根据上面逻辑操作的结果,更新界面
        self.label.setText("当前人数: 200")
        

if __name__ == "__main__":
    app = QApplication(sys.argv)

    window = Window()  
    window.setup_ui() 
    window.show()  

    sys.exit(app.exec_())

运行之后,点击按钮1,会发现界面卡死了,有的人着急再点击几下界面,软件就直接芭比Q了。

解决PyQt界面阻塞卡死问题

 造成这个现象的原因是,本来软件界面是一直占着主进程的,点击按钮之后,如果按钮执行的是长时间的操作,这个操作就把主进程占住不放了,没有进程来处理软件界面,这个时候界面就会卡死。

所以解决问题的思路就是主进程还是给软件界面,把按钮耗时的工作交给线程去处理,方法有很多,这里用PyQt中的QThread举例

class btn2Thread(QThread):

    def __init__(self):
        super(btn2Thread,self).__init__()

    def run(self):

        # 以下为一通逻辑操作,比如查询数据库
        time.sleep(10)
        
        # 更新主界面,但是在QThread里找不到主界面的控件

但是这里又会出现一个问题,在执行完复杂操作去更新界面的时候,发现在QThread找不到主界面的控件,就不能更新主界面了。

解决方法是,在线程里找不到主界面的控件,在主界面的进程里我们是可以找到控件的,那我们就把线程处理完的结果通过信号发送到主界面的进程,主界面在接收到这个消息后,根据接收到的消息更新主界面

class btn2Thread(QThread):
    # 声明一个信号
    update_ui_signal=pyqtSignal(str)

    def __init__(self):
        super(btn2Thread,self).__init__()

    def run(self):

        # 以下为一通逻辑操作,比如查询数据库
        time.sleep(10)

        # 根据查询数据库的结果,比如查询到200,发送信号
        self.update_ui_signal.emit((str(200)))

至此解决了界面卡死的问题,以下为完整代码文章来源地址https://www.toymoban.com/news/detail-505961.html

import sys

from PyQt5.Qt import *

import time

class btn2Thread(QThread):
    # 声明一个信号
    update_ui_signal=pyqtSignal(str)

    def __init__(self):
        super(btn2Thread,self).__init__()

    def run(self):

        # 以下为一通逻辑操作,比如查询数据库
        time.sleep(10)

        # 根据查询数据库的结果,比如查询到200,发送信号
        self.update_ui_signal.emit((str(200)))

class Window(QWidget):

    def __init__(self):
        super().__init__()  
        self.setWindowTitle("更新界面案例")
        self.resize(300, 200)
        self.move(400, 250)

    def setup_ui(self):
        self.label = QLabel(self)
        self.label.setText("当前人数: 100")
        self.label.move(100, 50)

        self.btn1=QPushButton(self)
        self.btn1.setText("按钮1")
        self.btn1.move(50,125)
        self.btn1.clicked.connect(self.btn1_method)

        self.btn2=QPushButton(self)
        self.btn2.setText("按钮2")
        self.btn2.move(165,125)
        self.btn2.clicked.connect(self.btn2_method)

    def btn1_method(self):
        
        # 以下为一通逻辑操作
        time.sleep(10)

        #根据上面逻辑操作的结果,更新界面
        self.label.setText("当前人数: 200")
        

    def btn2_method(self):
        self.btn2Thread_object=btn2Thread()
        self.btn2Thread_object.start()
        self.btn2Thread_object.update_ui_signal.connect(self.update_label)

    def update_label(self,str1):
        self.label.setText("当前人数: %s"%(str1))




if __name__ == "__main__":
    app = QApplication(sys.argv)

    window = Window()  
    window.setup_ui() 
    window.show()  

    sys.exit(app.exec_())

到了这里,关于解决PyQt界面阻塞卡死问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PyQt5设计好UI界面后,通过Python文件打开,控件集中在左上角问题解决方案

            在用PyQt5做GUI界面时遇到的一个问题,在QtDesigner预览的界面正常,但是转换成.py文件后show()出来的界面,控件都挤在左上角无法使用。 目录 一、问题 1.QtDesigner预览的界面正常​编辑 2.转换.py文件后通过show()方法,显示异常 二,解决方法 1.在MainWindow = QtWidgets.QM

    2024年02月04日
    浏览(35)
  • 【pyqt5】【多线程】【matplotlib】解决子线程上运行的matplotlib无法在主线程上的UI界面上绘制图形的问题

    在使用PyQt5为一个项目写UI界面的时候,我试图把matplotlib绘制的图像展示在UI界面的窗口中,但matplotlib是运行在一个子线程中的,这导致它出现了如下警告: UserWarning: Starting a Matplotlib GUI outside of the main thread will likely fail. 并且我无法使用 matplotlib.backends.backend_qt5agg 下的 Figur

    2024年02月08日
    浏览(32)
  • python中的yolov5结合PyQt5,使用QT designer设计界面没正确启动的解决方法

    一、窗体设计test: 默认你已经设计好了窗体后: 这时你需要的是保存生成的untitle.ui到某个文件夹下,然后在命令行中奖.ui转换为.py(,通过​​pyqt5​​​提供的转换工具,将​​ui​​​文件转换成​​python​​的代码) 或者使用在PyCharm中安装的工具: 然后你会看到mai

    2024年02月07日
    浏览(36)
  • [pyqt5]关于在pyqt5界面上鼠标位置问题

    先上代码,主要看鼠标移动事件里面代码 通过运行代码可以发现: 上面这2行就是相当于屏幕左上角坐标了

    2024年02月15日
    浏览(24)
  • ubuntu18.04图形界面卡死,鼠标键盘失灵, 通过MAC共享网络给Ubuntu解决!

    背景 故事的起因是pip install tensorflow-gpu, 出去上个厕所的功夫,回来页面就卡死了,重启了一下,死的更彻底了,在用户登陆页面鼠标和键盘都失灵了,根本无法输入密码然后进入系统。接下来讲下处理办法。 搜索出来很多的方案都是说可以 Ctrl+Alt+F1~F6 中的任意一个, 切换

    2024年04月15日
    浏览(32)
  • C#--耗时操作实现UI界面实时更新不阻塞(耗时操作解决窗体卡顿)

    C#实现窗体加载进度条或者百分比实时显示耗时操作的进度,方法有很多。但是经过我的学习、查找与实际应用,发现Task配合MethodInvoker最为高效便捷。下面我就来结合代码讲一下要注意的问题。 C#在winform上进行耗时操作往往会放置progressbar,问题是在UI线程上进行耗时操作就

    2024年02月03日
    浏览(23)
  • 界面开发(2)--- 使用PyQt5制作用户登陆界面

    上篇文章已经介绍了如何配置PyQt5环境,这篇文章在此基础上展开,主要记录一下如何使用 PyQt5 制作用户登陆界面,并对一些基础操作进行介绍。 下面是具体步骤,一起来看看吧! 1. 打开 Pycharm 中的 Qt Designer 工具。 2. 选择Main Window模式,创建界面窗口。 3. 移除菜单栏和状态

    2024年02月05日
    浏览(41)
  • 使用PYQT5设计登录界面并实现界面跳转

    目录   1 UI登录界面的布局 2 UI登录界面布局对应的代码 3 登录界面和界面跳转完整代码 4 跳转界面代码函数和优化界面代码 5 最终效果        其中, 欢迎使用 XXXX 软件管理员密码 使用的是左边功能的 label 类、 登录 使用的是左边功能的 Push Button 类、 管理员和密码的输入

    2024年02月02日
    浏览(37)
  • 《开始使用PyQT》 第01章 PyQT入门 03 用户界面介绍

    《开始使用PyQT》 第01章 PyQT入门 03 用户界面介绍 The user interface (UI) has become a key part of our everyday lives, becoming the intermediary between us and our ever-growing number of machines. A UI is designed to facilitate in human-computer interaction. The human needs to operate and control the machine to serve some purpose; meanwhile, t

    2024年02月21日
    浏览(27)
  • 使用PyQt简单实现YOLOv5交互界面

    可在过往博客查看,YOLO原理,以及具体训练过程 , 这篇文章是继续完善YOLO模型的使用,即将控制台cmd交互的YOLO5模型实现为交互界面可视化操作。我们前期已经搭建了一个QT框架,现在只要将具体函数与QT框架进行绑定即可。 个人建议直接将整个ui文件放置在YOLO5文件夹下,

    2024年02月08日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包