Уведомления

Группа в Telegram: @pythonsu

#1 Март 4, 2021 16:50:45

Temp
Зарегистрирован: 2021-01-16
Сообщения: 75
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQt5 - Сигнал при добавлении нового элемента в определённой директории

Доброго времени суток!

Ищу функцию, которая будет давать сигнал при добавлении нового файла в конкретной папке.
Функция моей мечты выглядит следующим образом:

 directory = "C:\Folder1\Folder2\Folder3"
self.QDir(directory).direcrion.entryList().countChanged.connect(self.MyFunction)
P.S. Все имена и события вымышлены, любые совпадения случайны

Офлайн

#2 Март 4, 2021 18:29:41

Temp
Зарегистрирован: 2021-01-16
Сообщения: 75
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQt5 - Сигнал при добавлении нового элемента в определённой директории

Вот мой вариант, который у меня получился:

 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 секунд, я ничего не придумал, в общем одни костыли

Офлайн

#3 Март 4, 2021 23:55:53

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

PyQt5 - Сигнал при добавлении нового элемента в определённой директории

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

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

Если используете QT там есть своя “ сторожевая собака” QFileSystemWatcher https://doc.qt.io/qt-5/qfilesystemwatcher.html и никаких костылей не нужно городить.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Март 5, 2021 00:01:48)

Офлайн

#4 Март 5, 2021 17:11:17

Temp
Зарегистрирован: 2021-01-16
Сообщения: 75
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQt5 - Сигнал при добавлении нового элемента в определённой директории

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” выделяется ошибкой

Прикреплённый файлы:
attachment Снимок экрана 2021-03-05 211102.jpg (13,1 KБ)

Офлайн

#5 Март 5, 2021 17:56:33

Temp
Зарегистрирован: 2021-01-16
Сообщения: 75
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQt5 - Сигнал при добавлении нового элемента в определённой директории


Судя по функционалу QFileSystemWatcher, можно лишь отслеживать изменение и удаление файлов и папок (заранее добавленных через addPath или addPaths), но никак не отслеживать появление нового файла

Отредактировано Temp (Март 5, 2021 17:57:24)

Офлайн

#6 Март 6, 2021 16:39:49

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

PyQt5 - Сигнал при добавлении нового элемента в определённой директории

Temp
вот только у меня “.connect” выделяется ошибкой
ХЗ, может у вас “с” или “о” на кирилице.Все работает.

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



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Март 6, 2021 16:41:26)

Офлайн

#7 Март 6, 2021 18:09:11

Temp
Зарегистрирован: 2021-01-16
Сообщения: 75
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQt5 - Сигнал при добавлении нового элемента в определённой директории


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

Тот пример из интернета, что я выкладывал выше, является правильным примером?

Офлайн

#8 Март 6, 2021 18:30:56

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

PyQt5 - Сигнал при добавлении нового элемента в определённой директории

да вроде да, вот это код вполне себе отрабатывает, правда там для 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_())



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Март 6, 2021 18:31:29)

Офлайн

#9 Март 6, 2021 18:44:28

Temp
Зарегистрирован: 2021-01-16
Сообщения: 75
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQt5 - Сигнал при добавлении нового элемента в определённой директории

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_())

Офлайн

#10 Март 6, 2021 20:31:14

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

PyQt5 - Сигнал при добавлении нового элемента в определённой директории

поставил себе pyqt5, все работает, ничего не подсвечивает, python3.7 x32, PyQt5-5.15.3
создал пустой файл, потом удалил его. в консоль вывелось 2 сообщения.
попробуйте запустить не из ИДЕ , а из консоли.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Март 6, 2021 20:45:42)

Прикреплённый файлы:
attachment Безымянный.png (24,8 KБ)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version