【PyQt5 學習記錄】004:簡單多線程筆記
阿新 • • 發佈:2018-10-16
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:簡單多線程筆記