Найти - Пользователи
Полная версия: PyQt5 - Сигнал при добавлении нового элемента в определённой директории
Начало » Python для новичков » PyQt5 - Сигнал при добавлении нового элемента в определённой директории
1 2
Temp
Доброго времени суток!

Ищу функцию, которая будет давать сигнал при добавлении нового файла в конкретной папке.
Функция моей мечты выглядит следующим образом:
 directory = "C:\Folder1\Folder2\Folder3"
self.QDir(directory).direcrion.entryList().countChanged.connect(self.MyFunction)
P.S. Все имена и события вымышлены, любые совпадения случайны
Temp
Вот мой вариант, который у меня получился:
 import sys
from PyQt5 import QtWidgets
from PyQt5.QtCore import QDir, QTimer
import Testwin_1
folder = r"C:\######\########\#########\Myfolder"
list = []
class Testing_1(QtWidgets.QMainWindow, Testwin_1.Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.setWindowTitle("Testing")
        self.init_UI()
    def init_UI(self):
        global list
        direcrion = QDir(folder)
        templist = direcrion.entryList()
        for file in templist:
            if "." in file:
                if file.split(".")[len(file.split("."))-1].lower() == "xls":
                    list.append(file)
        self.timer = QTimer()
        self.timer.timeout.connect(self.Refresh)
        self.timer.start(5000)
    def Refresh(self):
        global list
        direcrion = QDir(folder)
        templist = direcrion.entryList()
        for file in templist:
            if "." in file:
                if file.split(".")[len(file.split("."))-1].lower() == "xls":
                    if not file in list:
                        print("Новый XML: ",file)#########Вместо этой функции будут функции обработки данного файла
                        list = templist
                        break
        self.timer.start(5000)
def main():
    app = QtWidgets.QApplication(sys.argv)
    window = Testing_1()
    window.show()
    sys.exit(app.exec_())
if __name__ == "__main__":
    main()

Кроме как проверять папку folder через каждые 5 секунд, я ничего не придумал, в общем одни костыли
PEHDOM
Temp Уже поздно, поэтому общие советы.
Вам нужно мониторить события файловой системы.
Поскольку у вас венда, вам или нужно вешать свой хук на события венды касающиеся ФС, да вобщем под линуксом примерно тоже самое, если мы говорим про общие принципы.

Или воспользваться готовой либой типа вочдог https://blog.magrathealabs.com/filesystem-events-monitoring-with-python-9f5329b651c3

Если используете QT там есть своя “ сторожевая собака” QFileSystemWatcher https://doc.qt.io/qt-5/qfilesystemwatcher.html и никаких костылей не нужно городить.
Temp
PEHDOM
PEHDOM
Temp Уже поздно, поэтому общие советы.Вам нужно мониторить события файловой системы. Поскольку у вас венда, вам или нужно вешать свой хук на события венды касающиеся ФС, да вобщем под линуксом примерно тоже самое, если мы говорим про общие принципы.Или воспользваться готовой либой типа вочдог https://blog.magrathealabs.com/filesystem-events-monitoring-with-python-9f5329b651c3Если используете QT там есть своя “ сторожевая собака” QFileSystemWatcher https://doc.qt.io/qt-5/qfilesystemwatcher.html и никаких костылей не нужно городить.
Спасибо за информацию.
Вот только почему-то у меня QFileSystemWatcher работает криво:

Вот пример из интернета:
 fs_watcher = QFileSystemWatcher(['C:\\Folder'])
fs_watcher.directoryChanged.connect(self.directory_changed)

вот только у меня “.connect” выделяется ошибкой
Temp

Судя по функционалу QFileSystemWatcher, можно лишь отслеживать изменение и удаление файлов и папок (заранее добавленных через addPath или addPaths), но никак не отслеживать появление нового файла
PEHDOM
Temp
вот только у меня “.connect” выделяется ошибкой
ХЗ, может у вас “с” или “о” на кирилице.Все работает.

Temp
Судя по функционалу QFileSystemWatcher, можно лишь отслеживать изменение и удаление файлов и папок (заранее добавленных через addPath или addPaths), но никак не отслеживать появление нового файла
в смысле? оно отслеживает появление/исчезновения нового файла. Если в папке появляется/удаляется файл он передаеет имя папки в которой произошли изменения. Дальше вам нужно найти новый файл, например по времени создания, зная время получения сигнала. По крайней мере так вы не будете дрочить папку каждые 5 секунд, а будете это делать только когда нужно.
Если хотите сразу получать и имя созданого добавленого файла, тот попробуйте тогда watchdog Python library, судя по описанию у нее функционал побогаче, может она это и умеет..
Temp

PEHDOM
ХЗ, может у вас “с” или “о” на кирилице.Все работает.
написано на латинице, проверял копированием из примеров с интернета(((
Может помимо QFileSystemWatcher, нужно еще что-нибудь импортировать в проект чтоб .connect заработал???

Тот пример из интернета, что я выкладывал выше, является правильным примером?
PEHDOM
да вроде да, вот это код вполне себе отрабатывает, правда там для pyqt4, пятого под рукой нет..
 import sys
from PyQt4 import QtGui
from PyQt4 import QtCore
folder = 'd:\\TEMP'
def folder_event(string):
    print(string)
app = QtGui.QApplication(sys.argv)
mw= QtGui.QWidget()
mw.show()
fs_watcher = QtCore.QFileSystemWatcher([folder,])
fs_watcher.directoryChanged.connect(folder_event)
sys.exit(app.exec_())
Temp
PEHDOM
да вроде да, вот это код вполне себе отрабатывает, правда там для pyqt4, пятого под рукой нет..

 import sys
from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication, QWidget
folder = 'd:\\TEMP'
def folder_event(string):
    print(string)
app = QApplication(sys.argv)
mw = QWidget()
mw.show()
fs_watcher = QtCore.QFileSystemWatcher([folder,])
fs_watcher.directoryChanged.connect(folder_event)
sys.exit(app.exec_())
PEHDOM
поставил себе pyqt5, все работает, ничего не подсвечивает, python3.7 x32, PyQt5-5.15.3
создал пустой файл, потом удалил его. в консоль вывелось 2 сообщения.
попробуйте запустить не из ИДЕ , а из консоли.

This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB