千家信息网

Python Pyqt5多线程更新UI代码的实例分析

发表于:2025-11-10 作者:千家信息网编辑
千家信息网最后更新 2025年11月10日,Python Pyqt5多线程更新UI代码的实例分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。"""在编写GUI界面中,通常用会
千家信息网最后更新 2025年11月10日Python Pyqt5多线程更新UI代码的实例分析

Python Pyqt5多线程更新UI代码的实例分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

"""
在编写GUI界面中,通常用会有一些按钮,点击后触发事件,
比如去下载一个文件或者做一些操作,
这些操作会耗时,如果不能及时结束,主线程将会阻塞,
这样界面就会出现未响应的状态,因此必须使用多线程来解决这个问题。
"""

代码实例

 from PyQt5.Qt import (QApplication, QWidget, QPushButton,QThread,QMutex,pyqtSignal)import sysimport time qmut_1 = QMutex() # 创建线程锁qmut_2 = QMutex()qmut_3 = QMutex()# 继承QThreadclass Thread_1(QThread):  # 线程1    def __init__(self):        super().__init__()     def run(self):        qmut_1.lock() # 加锁        values = [1, 2, 3, 4, 5,6,7,8,9,10]        print("====     Thread_1    ====")        for i in values:            print("Thread_1:",i)            time.sleep(0.5)  # 休眠        qmut_1.unlock() # 解锁  class Thread_2(QThread):  # 线程2    _signal =pyqtSignal()    def __init__(self):        super().__init__()     def run(self):        # qmut_2.lock()  # 加锁        values = ["a", "b", "c", "d", "e","f","g","h","i","j","k"]        print("====     Thread_2    ====")        for i in values:            print("Thread_2:",i)            time.sleep(0.5)        # qmut_2.unlock()  # 解锁        self._signal.emit() class Thread_3(QThread):  # 线程2    _signal =pyqtSignal()    def __init__(self):        super().__init__()     def run(self):        qmut_3.lock()  # 加锁        values = ["a", "b", "c", "d", "e","f","g","h","i","j","k"]        print("====     Thread_3    ====")        for i in values:            print("Thread_3:",i)            time.sleep(0.5)        qmut_3.unlock()  # 解锁        self._signal.emit() #执行完毕后,释放信号 class Thread_01(QThread):  # 线程1    def __init__(self):        super().__init__()     def run(self):        values = [1, 2, 3, 4, 5]        print("====     Thread_01       ====")        for i in values:            print("Thread_01:",i)            time.sleep(0.5)  # 休眠 class Thread_02(QThread):  # 线程2    def __init__(self):        super().__init__()     def run(self):        values = ["a", "b", "c", "d", "e"]        print("====     Thread_02       ====")        for i in values:            print("Thread_02:",i)            time.sleep(0.5)  class MyWin(QWidget):    def __init__(self):        super().__init__()        # 按钮初始化        self.btn_01 = QPushButton('按钮_每点一次运行一次', self)        self.btn_01.move(80, 40)        self.btn_01.clicked.connect(self.click_01)  # 绑定槽函数         self.btn_02 = QPushButton('按钮_每点一次运行一次', self)        self.btn_02.move(80, 80)        self.btn_02.clicked.connect(self.click_02)  # 绑定槽函数         self.btn_1 = QPushButton('按钮_线程锁_多次点击,依次执行(滞后感)', self)        self.btn_1.move(80, 120)        self.btn_1.clicked.connect(self.click_1)  # 绑定槽函数         self.btn_2 = QPushButton('按钮_线程锁_收到完成信号后才能再次点击', self)        self.btn_2.move(80, 160)        self.btn_2.clicked.connect(self.click_2)  # 绑定槽函数         self.btn_3 = QPushButton('按钮_线程锁_收到完成信号后再次执行', self)        self.btn_3.move(80, 200)        self.btn_3.clicked.connect(self.click_3)  # 绑定槽函数     def click_01(self):        self.thread_01 = Thread_01()  # 创建线程        self.thread_01.start()  # 开始线程    def click_02(self):        self.thread_02 = Thread_02()  # 创建线程        self.thread_02.start()  # 开始线程     def click_1(self):        self.thread_1 = Thread_1()  # 创建线程        self.thread_1.start()  # 开始线程     def click_2(self):        self.btn_2.setEnabled(False)        self.thread_2 = Thread_2()        self.thread_2._signal.connect(self.set_btn_2) #信号连接,如果收到信号,就执行对应的函数        self.thread_2.start()     def click_3(self):        self.btn_3.setEnabled(False)        self.thread_3 = Thread_3()        self.thread_3._signal.connect(self.set_btn_3) #信号连接,如果收到信号,就执行对应的函数        self.thread_3.start()     def set_btn_2(self):        self.btn_2.setEnabled(True)     def set_btn_3(self):        self.btn_3.setEnabled(True)  if __name__ == "__main__":    app = QApplication(sys.argv)    myshow = MyWin()    myshow.setWindowTitle("多线程演示")    myshow.setMinimumHeight(500)    myshow.setMinimumWidth(500)    myshow.show()    sys.exit(app.exec_())

运行结果

==== Thread_01 ====

Thread_01: 1

Thread_01: 2

Thread_01: 3

Thread_01: 4

Thread_01: 5

==== Thread_02 ====

Thread_02: a

Thread_02: b

Thread_02: c

Thread_02: d

Thread_02: e

==== Thread_1 ====

Thread_1: 1

Thread_1: 2

Thread_1: 3

Thread_1: 4

Thread_1: 5

Thread_1: 6

Thread_1: 7

Thread_1: 8

Thread_1: 9

==== Thread_2 ====

Thread_2: a

Thread_1: 10

Thread_2: b

Thread_2: c

Thread_2: d

==== Thread_3 ====

Thread_3: a

Thread_2: e

Thread_3: b

Thread_2: f

Thread_3: c

Thread_2: g

Thread_3: d

Thread_2: h

Thread_3: e

Thread_2: i

Thread_3: f

Thread_2: j

Thread_3: g

Thread_2: k

Thread_3: h

运行过程

关于Python Pyqt5多线程更新UI代码的实例分析问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

线程 信号 函数 按钮 问题 运行 代码 实例 分析 实例分析 更新 再次 更多 界面 休眠 帮助 解答 易行 简单易行 事件 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 员工培训软件开发多少钱 远程管理的数据库 虹口区信息化软件开发定制价格 主题网络安全知识作文 网信办网络安全工作整改方案 sdk软件开发工具包简介 河北聚冀网络技术有限公司 河南嘉诚网络技术有限公司 战地二有服务器吗 民政局网络安全和信息化工作会议 手机软件开发需要什么语言 中国台湾文档软件开发咨询客服 山东处置网络安全 云服务数据库实例 订阅数据库的更新log 学习云网络安全心得体会 mdb数据库 读取速度慢 简述网络安全基本要素 网络安全宣传广告片 老头环发行时感觉服务器会崩掉 服务器管理器端口怎么查 云一网络技术工作室 河南爱众软件开发有限公司怎么样 学习计算机网络安全知识的好处 数据库sql声明变量 java服务器cpu选择依据 数字开发和软件开发哪个好 优质的软件开发报价 科技有限公司能做软件开发吗 如何自建服务器
0