PyQT5 停止死循环线程(监控文件是否修改)

说明

在软件使用中,大多数需要使用多线程来实现,并且需要线程长久执行,所以就需要用到死循环,哪如何停止该死循环线程呢?

监控文件是否修改

完整代码:点击查看

主界面代码

import sys
import os
from PyQt5.QtWidgets import (QWidget,QApplication, QTextEdit, QPushButton, QBoxLayout)
from PyQt5.QtCore import (QThread, pyqtSignal)

class Window(QWidget):

    def __init__(self, parent=None, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)
        self.initUI()

    def initUI(self):
        self.setWindowTitle('停止多线程死循环')
        self.resize(550, 450)
        # 创建多行文本框
        qtext_edit = QTextEdit()
        qtext_edit.resize(530, 430)
        qtext_edit.setObjectName("edit")
        # 创建三个按钮
        pushButton = QPushButton()
        pushButton.setText("导入文件")
        pushButton.clicked.connect(self.open_file)  # 导入文件
        qpush_button_start = QPushButton()
        qpush_button_start.setText("开始监控")
        qpush_button_start.clicked.connect(self.start_monitor) # 连接开始监控槽函数
        qpush_button_stop = QPushButton()
        qpush_button_stop.setText("停止监控")
        qpush_button_stop.clicked.connect(self.stop_monitor) # 连接停止监控槽函数
        # 添加到垂直布局 到 父控件
        v_layout = QBoxLayout(QBoxLayout.TopToBottom)
        self.setLayout(v_layout)
        # 添加水平布局控件
        lrlayout = QBoxLayout(QBoxLayout.LeftToRight)
        lrlayout.addWidget(pushButton)
        lrlayout.addWidget(qpush_button_start)
        lrlayout.addWidget(qpush_button_stop)
        v_layout.addWidget(qtext_edit)
        v_layout.addLayout(lrlayout)

    def open_file(self):
        print("导入文件")

    # 开始监控
    def start_monitor(self):
        print("点击开始")

    # 停止监控
    def stop_monitor(self):
        print("点击停止")



if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

mark

监控文件是否更新线程

监控文件需要开启一个线程,不然主界面就会出现假死

class Thread(QThread):

    # 自定义修改时间信号
    file_time = pyqtSignal(float)

    def __init__(self, path: str ,parent=None):
        super().__init__(parent)
        # 文件路径
        self.path = path
        # 死循环状态
        self.status = True
        # 默认文件最后修改时间
        self.endTime = 0.0

    def __del__(self):
        self.wait()

    def run(self) -> None:
        while self.status:
            # 判断文件修改时间
            if self.endTime != os.path.getmtime(self.path):
                self.endTime = os.path.getmtime(self.path)
            # 发送文件修改信号
            self.file_time.emit(self.endTime)
            self.sleep(1)

导入文件 & 更新文本框内容

def open_file(self):
    print("导入文件")
    # 选择文件
    self.file_Name_Type = QFileDialog.getOpenFileName(self, "选取文件")
    if self.file_Name_Type == "":
        print("\n取消选择")
        return
    self.qtext_edit.append(f"导入文件路径 {self.file_Name_Type[0]}")

# 添加文本框内容
def set_text(self,text: str):
    self.qtext_edit.append(f"文件最后修改时间 {text}")

开始 & 停止监控事件

点击开始监控 开启监控线程,点击停止监控,修改死循环条件

# 开始监控
def start_monitor(self):
    self.thread = Thread(self.file_Name_Type[0])
    # 接收文件修改时间信号
    self.thread.file_time.connect(self.set_text)
    self.thread.start()

# 停止监控
def stop_monitor(self):
    self.thread.status = False

效果

mark

发表评论 / Comment

用心评论~