Сканирование файлов по очереди

Вот мой код. Программа работает в принципе нормально, но если мы начинаем сканировать там, где много папок или файлов, то она зависает (не отвечает). Иногда это проходит в зависимости от того, сколько папок или файлов надо было сканировать. Вот вопрос: как сделать, чтобы файлы и папки сканировались по очереди?

from PyQt6 import QtCore, QtGui, QtWidgets
from PyQt6.QtWidgets import *
from SearchDocWin import *
import os
import chardet

class SearchDoc(QMainWindow):
    def __init__(self):
        super(SearchDoc, self).__init__()
        self.ui_SearchDoc = Ui_SearchDocWin()
        self.ui_SearchDoc.setupUi(self)
        self.ui_SearchDoc.searchBtn.clicked.connect(self.on_search)
        self.ui_SearchDoc.statusLabel.setText("")

    def on_search(self):
        search_text = self.ui_SearchDoc.text.text()
        search_path = self.ui_SearchDoc.dirText.text()
        self.ui_SearchDoc.statusLabel.setText("Идёт поиск...")

        self.ui_SearchDoc.table.setRowCount(0)
        if os.path.exists(search_path):
            for root, dirs, files in os.walk(search_path):
                for file in files:
                    if search_text.lower() in file.lower():
                        row = self.ui_SearchDoc.table.rowCount()
                        self.ui_SearchDoc.table.insertRow(row)
                        self.ui_SearchDoc.table.setItem(row, 0, QtWidgets.QTableWidgetItem(file))
                        self.ui_SearchDoc.table.setItem(row, 1, QtWidgets.QTableWidgetItem(os.path.join(root, file)))
                        
                    if file.lower().endswith(".txt"):
                        with open(os.path.join(root, file), 'rb') as f:
                            data = f.read()
                            encoding = chardet.detect(data)['encoding']
                        try: 
                            with open(os.path.join(root, file), encoding=encoding) as f:
                                text = f.read()
                        except UnicodeDecodeError:
                            with open(os.path.join(root, file), encoding='utf-8', errors='ignore') as f:
                                text = f.read()

                        if search_text.lower() in text.lower():
                            row = self.ui_SearchDoc.table.rowCount()
                            self.ui_SearchDoc.table.insertRow(row)
                            self.ui_SearchDoc.table.setItem(row, 0, QtWidgets.QTableWidgetItem(file))
                            self.ui_SearchDoc.table.setItem(row, 1, QtWidgets.QTableWidgetItem(os.path.join(root, file)))
            self.ui_SearchDoc.statusLabel.setText("Поиск закончен.")
        else:
            self.ui_SearchDoc.statusLabel.setText("Директория не найдена")

Если понадобится вот код где лежит весь дизайн

from PyQt6 import QtCore, QtGui, QtWidgets


class Ui_SearchDocWin(object):
    def setupUi(self, SearchDocWin):
        SearchDocWin.setObjectName("SearchDocWin")
        SearchDocWin.resize(647, 475)
        SearchDocWin.setMinimumSize(QtCore.QSize(647, 475))
        SearchDocWin.setMaximumSize(QtCore.QSize(647, 475))
        SearchDocWin.setStyleSheet("background-color: rgb(39, 39, 39);")
        self.centralwidget = QtWidgets.QWidget(parent=SearchDocWin)
        self.centralwidget.setObjectName("centralwidget")
        self.statusLabel = QtWidgets.QLabel(parent=self.centralwidget)
        self.statusLabel.setGeometry(QtCore.QRect(20, 91, 511, 20))
        font = QtGui.QFont()
        font.setFamily("Noto Sans")
        font.setBold(True)
        self.statusLabel.setFont(font)
        self.statusLabel.setStyleSheet("color: rgb(255, 255, 255);")
        self.statusLabel.setObjectName("statusLabel")
        self.table = QtWidgets.QTableWidget(parent=self.centralwidget)
        self.table.setGeometry(QtCore.QRect(20, 120, 601, 341))
        self.table.setStyleSheet("QTableWidget {\n"
"    background-color: rgb(39, 39, 39);\n"
"    color: rgb(255, 255, 255);\n"
"    selection-background-color: rgb(255, 140, 0);\n"
"}\n"
"\n"
"QTableWidget QHeaderView::section {\n"
"    background-color: rgb(39, 39, 39);\n"
"    color: rgb(255, 255, 255);  \n"
"}\n"
"\n"
"QTableWidget QTableCornerButton::section {\n"
"    background-color: rgb(39, 39, 39);\n"
"}")
        self.table.setRowCount(0)
        self.table.setObjectName("table")
        self.table.setColumnCount(2)
        item = QtWidgets.QTableWidgetItem()
        self.table.setHorizontalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.table.setHorizontalHeaderItem(1, item)
        self.table.horizontalHeader().setDefaultSectionSize(280)
        self.table.horizontalHeader().setMinimumSectionSize(39)
        self.table.verticalHeader().setDefaultSectionSize(30)
        self.table.verticalHeader().setMinimumSectionSize(24)
        self.searchBtn = QtWidgets.QPushButton(parent=self.centralwidget)
        self.searchBtn.setGeometry(QtCore.QRect(572, 90, 51, 21))
        self.searchBtn.setStyleSheet("QPushButton {\n"
"color: rgb(255, 255, 255);\n"
"background-color: rgb(0, 0, 0);\n"
"font: 700 9pt \"Segoe UI\";\n"
"border: 2px solid;\n"
"border-radius: 9px;\n"
"border-color: rgb(255, 255, 255);\n"
"}\n"
"\n"
"QPushButton:hover {\n"
"background-color: rgb(223, 105, 3);\n"
"border: 2px solid;\n"
"border-radius: 9px;\n"
"border-color: rgb(200, 200, 200);\n"
"}\n"
"\n"
"QPushButton:pressed {\n"
"background-color: rgb(255, 130, 0);\n"
"}")
        self.searchBtn.setObjectName("searchBtn")
        self.text = QtWidgets.QLineEdit(parent=self.centralwidget)
        self.text.setGeometry(QtCore.QRect(20, 30, 603, 22))
        self.text.setStyleSheet("color: rgb(255, 255, 255);")
        self.text.setObjectName("text")
        self.dirText = QtWidgets.QLineEdit(parent=self.centralwidget)
        self.dirText.setGeometry(QtCore.QRect(20, 60, 603, 22))
        self.dirText.setStyleSheet("color: rgb(255, 255, 255);")
        self.dirText.setObjectName("dirText")
        SearchDocWin.setCentralWidget(self.centralwidget)

        self.retranslateUi(SearchDocWin)
        QtCore.QMetaObject.connectSlotsByName(SearchDocWin)

    def retranslateUi(self, SearchDocWin):
        _translate = QtCore.QCoreApplication.translate
        SearchDocWin.setWindowTitle(_translate("SearchDocWin", "Скрепочка"))
        self.statusLabel.setText(_translate("SearchDocWin", "Идёт поиск..."))
        item = self.table.horizontalHeaderItem(0)
        item.setText(_translate("SearchDocWin", "Файл"))
        item = self.table.horizontalHeaderItem(1)
        item.setText(_translate("SearchDocWin", "Путь"))
        self.searchBtn.setText(_translate("SearchDocWin", "Поиск"))
        self.text.setPlaceholderText(_translate("SearchDocWin", "Введите текст который надо найти:"))
        self.dirText.setPlaceholderText(_translate("SearchDocWin", "Введите путь где искать файлы:"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    SearchDocWin = QtWidgets.QMainWindow()
    ui = Ui_SearchDocWin()
    ui.setupUi(SearchDocWin)
    SearchDocWin.show()
    sys.exit(app.exec())

Ответы (0 шт):