1. 程式人生 > >【PyQt5 學習記錄】004:簡單多線程筆記

【PyQt5 學習記錄】004:簡單多線程筆記

elf false fix sign widgets qtextedit odin 文本 spa

在文本編輯框中每隔幾秒添加一行文本。

 1 #!/usr/bin/python3
 2 # -*- coding:utf-8 -*-
 3 
 4 import sys
 5 import time
 6 from PyQt5.QtWidgets import (QApplication,
 7                              QWidget,
 8                              QLineEdit,
 9                              QPushButton,
10                              QTextEdit,
11 QGridLayout) 12 from PyQt5.QtCore import (Qt, 13 QThread, 14 pyqtSignal) 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()

界面如圖:

技術分享圖片

 1 class MyThread(QThread):
 2     signal = pyqtSignal(str)
 3 
 4     def __init__(self):
 5         super().__init__()
 6         self.source_txt = None
 7         self.running = True
 8 
 9     def __del__(self):
10         self.wait(1)
11 
12     def on_source(self, line_text):
13             self.source_txt = line_text
14 
15     def run(self):
16         while self.running:
17             self.signal.emit(self.source_txt)
18             time.sleep(1)

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

 1 class Run(Window):
 2     sig = pyqtSignal(str)
 3 
 4     def __init__(self):
 5         super().__init__()
 6 
 7         self.my_thread = None
 8         self.pushButton.clicked.connect(self.button)
 9         self.stopButton.clicked.connect(self.stop_button)
10 
11     def button(self):
12         line_text = self.lineEdit.text()
13         self.my_thread = MyThread()
14         self.textEdit.clear()
15         self.my_thread.start()
16         self.my_thread.on_source(line_text)
17         self.my_thread.signal.connect(self.information)
18         self.pushButton.setEnabled(False)
19 
20     def information(self, info):
21         self.textEdit.append(str(info))
22 
23     def stop_button(self):
24         self.my_thread.running = False
25         time.sleep(1)
26         self.pushButton.setEnabled(True)
27 
28 
29 if __name__ == "__main__":
30     app = QApplication(sys.argv)
31     win = Run()
32     sys.exit(app.exec_())

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

點擊stopButton時,停止線程。

技術分享圖片

【PyQt5 學習記錄】004:簡單多線程筆記