【PyQt5】信號與槽+多線程


經常會遇到一段需要持續運行的程序,在運行過程中會定時或不定時的數據一些信息。在PyQt5中界面會一直等到程序結束后一次性顯示所有信息,同時整個界面就會卡住。QThread 模塊就是用來解決這個問題的。

書中舉得例子是實時顯示時間,就不多說了。我自己也寫了一個例子加強理解。UI界面使用designer做好了,用pyuic5轉換成的py文件,就是所謂的界面和業務分離的操作。

先上界面代碼:

 1 from PyQt5 import QtCore, QtGui, QtWidgets
 2 
 3 
 4 class Ui_MainWindow(object):
 5     def setupUi(self, MainWindow):
 6         MainWindow.setObjectName("MainWindow")
 7         MainWindow.resize(258, 340)
 8         self.centralwidget = QtWidgets.QWidget(MainWindow)
 9         self.centralwidget.setObjectName("centralwidget")
10         self.pushButton = QtWidgets.QPushButton(self.centralwidget)
11         self.pushButton.setGeometry(QtCore.QRect(150, 40, 75, 23))
12         self.pushButton.setObjectName("pushButton")
13         self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)
14         self.textBrowser.setGeometry(QtCore.QRect(0, 110, 251, 221))
15         self.textBrowser.setObjectName("textBrowser")
16 
17         MainWindow.setCentralWidget(self.centralwidget)
18 
19         self.retranslateUi(MainWindow)
20         QtCore.QMetaObject.connectSlotsByName(MainWindow)
21 
22     def retranslateUi(self, MainWindow):
23         _translate = QtCore.QCoreApplication.translate
24         MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
25         self.pushButton.setText(_translate("MainWindow", "PushButton"))
View Code

再上業務代碼:

 1 import sys
 2 import time
 3 from PyQt5.QtWidgets import QApplication ,QMainWindow
 4 from PyQt5.QtCore import pyqtSignal, QObject, QThread
 5 from win_signal_slot import *
 6 
 7 
 8 class BackendThread(QThread):
 9     update_date = pyqtSignal(str)
10 
11     def run(self):
12         for i in range(100):
13             if i % 3 == 0:
14                 self.update_date.emit('%d發送成功' % i)
15             time.sleep(0.1)
16         self.update_date.emit('程序執行結束。')
17 
18 
19 class MainWindow(QMainWindow, Ui_MainWindow):
20 
21     def __init__(self, parent=None):
22         super(MainWindow, self).__init__(parent)
23         self.setupUi(self)
24 
25         self.pushButton.clicked.connect(self.run)
26 
27 
28     def run(self):
29         self.textBrowser.setText('程序開始執行...')
30         #執行后台的線程
31         self.backend = BackendThread()
32         self.backend.update_date.connect(self.show_msg)
33         self.backend.start()
34 
35     def show_msg(self,data):
36         self.textBrowser.append(data)
37 
38 if __name__ == '__main__':
39     app = QApplication(sys.argv)
40     win = MainWindow()
41     win.show()
42     sys.exit(app.exec_())
View Code

頁面展示出來就是這個樣:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM