Сканирование файлов по очереди
Вот мой код. Программа работает в принципе нормально, но если мы начинаем сканировать там, где много папок или файлов, то она зависает (не отвечает). Иногда это проходит в зависимости от того, сколько папок или файлов надо было сканировать. Вот вопрос: как сделать, чтобы файлы и папки сканировались по очереди?
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())