【PyQt5 學習記錄】004:簡單QThread筆記


在文本編輯框中每隔幾秒添加一行文本,代碼如下:

  1 #!/usr/bin/python3
  2 # -*- coding:utf-8 -*-
  3 
  4 import sys
  5 from PyQt5.QtWidgets import (QApplication,
  6                              QWidget,
  7                              QLineEdit,
  8                              QPushButton,
  9                              QTextEdit,
 10                              QGridLayout)
 11 from PyQt5.QtCore import (Qt,
 12                           QThread,
 13                           pyqtSignal,
 14                           pyqtSlot)
 15 
 16 
 17 class Window(QWidget):
 18     def __init__(self, parent=None):
 19         super(Window, self).__init__(parent, Qt.Widget)
 20 
 21         self.resize(460, 460)
 22         self.setWindowTitle("Thread Test")
 23 
 24         self.lineEdit = QLineEdit(self)
 25         self.lineEdit.setPlaceholderText("connect to...")
 26         self.pushButton = QPushButton(">>", self)
 27         self.pushButton.setFixedWidth(30)
 28         self.stopButton = QPushButton("×", self)
 29         self.stopButton.setFixedWidth(30)
 30         self.textEdit = QTextEdit(self)
 31         self.textEdit.setPlaceholderText("result...")
 32 
 33         grid = QGridLayout()
 34         grid.addWidget(self.lineEdit, 0, 0, 1, 3)
 35         grid.addWidget(self.pushButton, 0, 3)
 36         grid.addWidget(self.stopButton, 0, 4)
 37         grid.addWidget(self.textEdit, 1, 0, 5, 5)
 38         self.setLayout(grid)
 39 
 40         self.show()
 41 
 42 
 43 class Run(Window):
 44     sig = pyqtSignal(str)
 45 
 46     def __init__(self):
 47         super().__init__()
 48 
 49         self.my_thread = None
 50         self.pushButton.clicked.connect(self.button)
 51         self.stopButton.clicked.connect(self.stop_button)
 52 
 53     def button(self):
 54         self.textEdit.clear()
 55         line_text = self.lineEdit.text()
 56         # 創建線程
 57         self.my_thread = MyThread()
 58         # 將自定義信號sig連接到MyThread.on_source函數
 59         self.sig.connect(self.my_thread.on_source)
 60         # 向MyThread.on_source函數傳遞line_text
 61         self.sig.emit(line_text)
 62         # 直接調用MyThread.on_source()也可以,但還是建議使用信號傳遞,在靈活性和性能上更佳
 63         # self.my_thread.on_source(line_text)
 64         # 將自定義信號signal連接到information()槽函數
 65         self.my_thread.signal.connect(self.information)
 66         # 啟動線程
 67         self.my_thread.start()
 68         self.pushButton.setEnabled(False)
 69 
 70     @pyqtSlot(str)
 71     def information(self, info):
 72         # 向textEdit添加lineEdit的文本
 73         self.textEdit.append(info)
 74 
 75     def stop_button(self):
 76         self.pushButton.setEnabled(True)
 77         # 將MyThread.running設為False以停止線程
 78         self.my_thread.running = False
 79 
 80 
 81 class MyThread(QThread):
 82     # 自定義型號,執行run()函數時,從相關線程發射此信號
 83     signal = pyqtSignal(str)
 84 
 85     def __init__(self):
 86         super().__init__()
 87         self.source_txt = None
 88         self.running = True
 89 
 90     # 當發生QThread: Destroyed while thread is still running錯誤時,添加QThread.wait()
 91     # def __del__(self):
 92     #    self.wait()
 93 
 94     def on_source(self, line_text):
 95             self.source_txt = line_text
 96 
 97     @pyqtSlot()
 98     def run(self):
 99         while self.running:
100             # 發出信號
101             self.signal.emit(self.source_txt)
102             # 線程休眠1秒
103             self.sleep(1)
104 
105 
106 if __name__ == "__main__":
107     app = QApplication(sys.argv)
108     win = Run()
109     sys.exit(app.exec_())

 

界面如圖:

當線程開始運行時,每隔1秒傳遞一個self.source_txt。

點擊pushButton時,使按鈕不可用,並啟動線程,在文本編輯框內不斷插入lienEdit的內容。

點擊stopButton時,停止線程。

 


免責聲明!

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



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