阅读 490

Python Pyqt5多线程更新UI代码实例(防止界面卡死)

这篇文章通过代码实例给大家介绍了Python Pyqt5多线程更新UI防止界面卡死的问题,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

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

代码实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
from PyQt5.Qt import (QApplication, QWidget, QPushButton,QThread,QMutex,pyqtSignal)
import sys
import time
  
qmut_1 = QMutex() # 创建线程锁
qmut_2 = QMutex()
qmut_3 = QMutex()
# 继承QThread
class 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代码实例(防止界面卡死)的文章就介绍到这了

原文链接:https://blog.csdn.net/zh6526157/article/details/121629105


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐