千家信息网

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

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,Python Pyqt5多线程更新UI代码的实例分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。"""在编写GUI界面中,通常用会
千家信息网最后更新 2026年11月01日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安全错误 数据库的锁怎样保障安全 互联网是不是新科技 上海挚品互联网科技 小马过河互联网科技 佰商互联网科技有限公司 深圳卡尔迅互联网科技有限公司怎么样 济南和联互联网科技有限公司 老年人脱离互联网科技的作文 卫星互联网科技股票 重庆威客帮互联网科技 互联网为啥属于高科技 厦门比较好的科技互联网公司 互联网科技大奖都有哪些公司 996高科技互联网公司 互联网科技和法律行业 卓翼科技产业互联网合作 互联网方面的科技前沿 黑科技 体验场景 互联网大会 互联网公司高科技产品 黑云互联网科技有限公司 互联网营销推广黑科技 深圳市人人互联网科技有限公司 互联网巨头科技公司 互联网与未来科技 卓越科技(互联网 ) 无锡溥仪互联网科技有限公司 互联网经济与金融科技 武汉健翔互联网络科技有限公司 阿里互联网科技企业 互联网科技品牌 上海互联网科技园景观
0