zoukankan      html  css  js  c++  java
  • 【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时,停止线程。

  • 相关阅读:
    VMware搭建VMware ESXi 6.7
    77. Combinations
    47. Permutations II
    system design
    37. Sudoku Solver
    12月9日学习日志
    12月8日学习日志
    12月7日学习日志
    12月6日学习日志
    12月5日学习日志
  • 原文地址:https://www.cnblogs.com/jmtm/p/9796819.html
Copyright © 2011-2022 走看看