Python+PySide2:使用多线程处理界面卡死的情况

2023-11-10

本篇主要是梳理一下,在使用 Pyside2 模块的时候,利用多线程处理页面假死【exe未响应】的问题


一、 这边举个例子吧【如下图所示】

在这里插入图片描述

  1. 测试代码如下

    class Stats():
    
        def __init__(self):
            # 从文件中加载UI定义
            super().__init__()
            qfile_stats = QFile(f'{os.getcwd()}\\thread.ui')
            qfile_stats.open(QFile.ReadOnly)
            qfile_stats.close()
    
            self.ui = QUiLoader().load(f'{os.getcwd()}\\thread.ui')
    
            # 重置倒退进度条的进度
            self.ui.progressBar.reset()
            self.ui.progressBar.setValue(0)
            
            # 按钮绑定执行方法
            self.ui.pushButton.clicked.connect(self.test_1)
    
        '''点击触发进度条增加'''
        def test_1(self):
            for i in range(1,101):
                self.ui.progressBar.setValue(i)
                time.sleep(1)
    

二、问题出现的原因

界面中,通常会有一些按钮,点击后触发事件
如去下载一个文件或做一些操作,这些操作会耗时
如果不能及时结束,主线程将会阻塞,这样界面就会出现未响应的状态


三、问题解决办法 【多线程】

优化后的代码:

res_lock = Lock()
class Stats(QObject):

    # 实例化一个信号槽函数
    progress_sigal = Signal(int)
    textBrowser_results_sigal = Signal(str)

    def __init__(self):
        # 从文件中加载UI定义
        super().__init__()
        qfile_stats = QFile(f'{os.getcwd()}\\thread.ui')
        qfile_stats.open(QFile.ReadOnly)
        qfile_stats.close()

        self.ui = QUiLoader().load(f'{os.getcwd()}\\thread.ui')
        # 重置倒退进度条的进度
        self.ui.progressBar.reset()
        self.ui.progressBar.setValue(0)
        self.ui.pushButton.clicked.connect(self.test_1)

        # 使用到了 lambda 函数,信号槽函数连接方法
        self.progress_sigal.connect(lambda x: self.ui.progressBar.setValue(x))
        self.textBrowser_results_sigal.connect(lambda y: self.ui.textBrowser.append(y))

    '''点击触发进度条增加'''
    def test_1(self):
        for i in range(0,101,5):
            # 操作共享数据前,申请获取锁
            res_lock.acquire()
            self.ui.progressBar.setValue(i)
            # 发射信号,通知 UI 更新
            self.textBrowser_results_sigal.emit(f"当前进度:{i}%")
            time.sleep(0.1)
            # 发射信号,通知 UI 更新
            self.progress_sigal.emit(i)
            # 操作共享数据后,释放锁
            res_lock.release()

四、效果实现

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python+PySide2:使用多线程处理界面卡死的情况 的相关文章

  • python:查找围绕某个 GPS 位置的圆的 GPS 坐标的优雅方法

    我有一组以十进制表示的 GPS 坐标 并且我正在寻找一种方法来查找每个位置周围半径可变的圆中的坐标 这是一个例子 http green and energy com downloads test circle html我需要什么 这是一个圆
  • Pandas/Google BigQuery:架构不匹配导致上传失败

    我的谷歌表中的架构如下所示 price datetime DATETIME symbol STRING bid open FLOAT bid high FLOAT bid low FLOAT bid close FLOAT ask open
  • 使用 Python 从文本中删除非英语单词

    我正在 python 上进行数据清理练习 我正在清理的文本包含我想删除的意大利语单词 我一直在网上搜索是否可以使用像 nltk 这样的工具包在 Python 上执行此操作 例如给出一些文本 Io andiamo to the beach w
  • 跟踪 pypi 依赖项 - 谁在使用我的包

    无论如何 是否可以通过 pip 或 PyPi 来识别哪些项目 在 Pypi 上发布 可能正在使用我的包 也在 PyPi 上发布 我想确定每个包的用户群以及可能尝试积极与他们互动 预先感谢您的任何答案 即使我想做的事情是不可能的 这实际上是不
  • 删除flask中的一对一关系

    我目前正在使用 Flask 开发一个应用程序 并且在删除一对一关系中的项目时遇到了一个大问题 我的模型中有以下结构 class User db Model tablename user user id db Column db String
  • 如何使用 Pandas、Numpy 加速 Python 中的嵌套 for 循环逻辑?

    我想检查一下表的字段是否TestProject包含了Client端传入的参数 嵌套for循环很丑陋 有什么高效简单的方法来实现吗 非常感谢您的任何建议 def test parameter a list parameter b list g
  • 在Python中连接反斜杠

    我是 python 新手 所以如果这听起来很简单 请原谅我 我想加入一些变量来生成一条路径 像这样 AAAABBBBCCCC 2 2014 04 2014 04 01 csv Id TypeOfMachine year month year
  • 如何通过索引列表从 dask 数据框中选择数据?

    我想根据索引列表从 dask 数据框中选择行 我怎样才能做到这一点 Example 假设我有以下 dask 数据框 dict A 1 2 3 4 5 6 7 B 2 3 4 5 6 7 8 index x1 a2 x3 c4 x5 y6 x
  • pyspark 将 twitter json 流式传输到 DF

    我正在从事集成工作spark streaming with twitter using pythonAPI 我看到的大多数示例或代码片段和博客是他们从Twitter JSON文件进行最终处理 但根据我的用例 我需要所有字段twitter J
  • Numpy - 根据表示一维的坐标向量的条件替换数组中的值

    我有一个data多维数组 最后一个是距离 另一方面 我有距离向量r 例如 Data np ones 20 30 100 r np linspace 10 50 100 最后 我还有一个临界距离值列表 称为r0 使得 r0 shape Dat
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 使用特定颜色和抖动在箱形图上绘制数据点

    我有一个plotly graph objects Box图 我显示了箱形 图中的所有点 我需要根据数据的属性为标记着色 如下所示 我还想抖动这些点 下面未显示 Using Box我可以绘制点并抖动它们 但我不认为我可以给它们着色 fig a
  • 如何断言 Unittest 上的可迭代对象不为空?

    向服务提交查询后 我会收到一本字典或一个列表 我想确保它不为空 我使用Python 2 7 我很惊讶没有任何assertEmpty方法为unittest TestCase类实例 现有的替代方案看起来并不正确 self assertTrue
  • Pandas 将多行列数据帧转换为单行多列数据帧

    我的数据框如下 code df Car measurements Before After amb temp 30 268212 26 627491 engine temp 41 812730 39 254255 engine eff 15
  • 实现 XGboost 自定义目标函数

    我正在尝试使用 XGboost 实现自定义目标函数 在 R 中 但我也使用 python 所以有关 python 的任何反馈也很好 我创建了一个返回梯度和粗麻布的函数 它工作正常 但是当我尝试运行 xgb train 时它不起作用 然后 我
  • 使用for循环时如何获取前一个元素? [复制]

    这个问题在这里已经有答案了 可能的重复 Python 循环内的上一个和下一个值 https stackoverflow com questions 1011938 python previous and next values inside
  • Scipy Sparse:SciPy/NumPy 更新后出现奇异矩阵警告

    我的问题是由大型电阻器系统的节点分析产生的 我基本上是在设置一个大的稀疏矩阵A 我的解向量b 我正在尝试求解线性方程A x b 为了做到这一点 我正在使用scipy sparse linalg spsolve method 直到最近 一切都
  • Django-tables2 列总计

    我正在尝试使用此总结列中的所有值文档 https github com bradleyayers django tables2 blob master docs pages column headers and footers rst 但页
  • 如何计算Python中字典中最常见的前10个值

    我对 python 和一般编程都很陌生 所以请友善 我正在尝试分析包含音乐信息的 csv 文件并返回最常听的前 n 个乐队 从下面的代码中 每听一首歌曲都是一个列表中的字典条目 格式如下 album Exile on Main Street
  • 在 JavaScript 函数的 Django 模板中转义字符串参数

    我有一个 JavaScript 函数 它返回一组对象 return Func id name 例如 我在传递包含引号的字符串时遇到问题 Dr Seuss ABC BOOk 是无效语法 I tried name safe 但无济于事 有什么解

随机推荐