祝大家有美好的一天。请告诉我如何在单独的线程中实现某个函数的执行,以使 GUI 不会冻结。我给出了一个脚本示例,其中只有三个按钮和一个单行文本编辑器字段。
该脚本的思想是,您需要通过单击浏览按钮(或在编辑器字段中手动输入)来指定某个文件夹的路径,其中每隔一段时间会出现新文件。路径确定后,需要点击开始按钮监控该文件夹,以便在文件夹中发现新文件时对其进行重命名。
在我们单击按钮开始重命名文件后,GUI 冻结,但脚本继续工作,当新文件出现在所选文件夹中时,它们被重命名。
GUI 必须不挂机,当您单击按钮完成重命名时,此功能将停止工作。
我知道,你可以通过 QThread 来实现它,我尝试使用它,结果是它使文件夹的路径最初应该写入脚本。
在将 QThread 添加到它之前,我正在附加脚本本身。
# -*- coding: utf-8 -*-
import sys
import os
from datetime import datetime
import time
from PyQt5.QtCore import QObject, QThread
from PyQt5.QtWidgets import QLineEdit, QApplication, QWidget, QPushButton,
QToolTip, QMessageBox, QDesktopWidget, QFileDialog
from PyQt5.QtGui import QIcon
filename = 'log.txt'
class renamerus_widget(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.btn_view = QPushButton('Обзор', self)
self.btn_view.setToolTip('Выбери папку')
self.btn_view.clicked.connect(self.show_dialog)
self.btn_view.resize(50, 25)
self.btn_view.move(10, 60)
self.btn_start = QPushButton('Запуск!', self)
self.btn_start.setToolTip('Активация мониторинга папки и переименование файлов в ней')
self.btn_start.clicked.connect(self.start_rename)
self.btn_start.resize(70, 25)
self.btn_start.move(78, 60)
self.btn_stop = QPushButton('Хорош..', self)
self.btn_stop.setToolTip('Прекращение мониторинга папки и переименование файлов в ней')
self.btn_stop.setDisabled(True)
self.btn_stop.clicked.connect(self.stop_rename)
self.btn_stop.resize(70, 25)
self.btn_stop.move(150, 60)
self.line_directory = QLineEdit(self)
self.line_directory.resize(210, 25)
self.line_directory.move(10, 30)
self.setFixedSize(230, 90)
self.center()
self.setWindowTitle('Renamerus')
self.setWindowIcon(QIcon('путь к файлу иконки'))
self.show()
def center(self):
sizeWindow = self.frameGeometry()
locationWindow = QDesktopWidget().availableGeometry().center()
sizeWindow.moveCenter(locationWindow)
self.move(sizeWindow.topLeft())
def close_event(self, event):
question_exit = QMessageBox.question(self,'Закрыть','На этом все?', QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if question_exit == QMessageBox.Yes:
event.accept()
else:
event.ignore()
def show_dialog(self):
open_direct = QFileDialog.getExistingDirectory(self, 'Выбирай','C://', QFileDialog.DontUseNativeDialog)
self.line_directory.setText(open_direct)
def start_rename(self, event):
self.btn_start.setDisabled(True)
self.btn_stop.setEnabled(True)
if len(self.line_directory.text()) != 0:
try:
while True:
list_files = os.listdir(self.line_directory.text())
if len(list_files) != 0:
for i in range(len(list_files)):
a = list_files[i]
if a[2] != '.':
now = datetime.now()
now_date = datetime.strftime(datetime.now(), "%d.%m.%Y %H.%M.%S")
try:
new_name = os.rename(self.line_directory.text() + '//' + list_files[i], self.line_directory.text() + '//' + str(now_date) + a[-4:])
except PermissionError:
time.sleep(5)
new_name = os.rename(self.line_directory.text() + '//' + list_files[i], self.line_directory.text() + '//' + str(now_date) + a[-4:])
with open(filename, 'a') as logfile:
logfile.write('Файл "' + a + '" переименован в ' + '"' + str(now_date) + a[-4:] + '"\n')
time.sleep(1)
else:
time.sleep(10)
except FileNotFoundError:
QMessageBox.information(self, 'Папку не нашел', 'Найди то, не зная что?!', QMessageBox.Ok)
else:
QMessageBox.information(self, 'Папка не определена', 'Укажи папку! ', QMessageBox.Ok)
def stop_rename(self):
#Тут должна быть функция, которая останавливает действие start_rename
if __name__ == '__main__':
app = QApplication([])
ex = renamerus_widget()
sys.exit(app.exec_())
1 个回答