如何使用QFileSystemWatch只发出一个directoryChanged信号

2024-09-29 23:30:38 发布

您现在位置:Python中文网/ 问答频道 /正文

以下是我申请的基本前提:

我建立了一个QFileSystemWatcher来监视目录。在

Path = [r'C:\Users\user\Documents\Images']
DirectoryWatcher = QtCore.QFileSystemWatcher(Path)
DirectoryWatcher.directoryChanged.connect(showImages.UpdateImages)

我以前用过QFileSystemWatcher,它总是工作得很好(无论是目录还是文件更改)。在

应用程序将在\images文件夹中显示图像的幻灯片。将新图像放入\Images文件夹后,幻灯片将重置为包含新图像。如果从\Images文件夹中删除了图像,则幻灯片将再次重置。在

我遇到的问题是:如果我将多个图像拖到\images文件夹中,directoryChanged信号将被多次触发。当它们被添加到同一个映像的文件夹中时,我甚至会将它们拖到相同的映像中。在

这破坏了我的日常生活。对于一批目录更改,有没有方法触发一次directoryChanged信号?一、 e.在最终图像添加到目录之前,我可以禁用信号吗?在

非常感谢!在


Tags: path图像目录文件夹信号users重置images
1条回答
网友
1楼 · 发布于 2024-09-29 23:30:38

解决方案是简单地避免将directoryChanged信号连接到更新图像的插槽。相反,只要在发生任何更改时设置一个标志,然后定期检查该标志以查看是否需要任何更新(这可以通过一个简单的计时器机制来完成)。在

下面是一个基本的脚本来演示这个想法:

import sys, os
from PyQt4 import QtCore, QtGui

class Window(QtGui.QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.list = QtGui.QListWidget(self)
        self.button = QtGui.QPushButton('Choose Directory', self)
        self.button.clicked.connect(self.handleSetDirectory)
        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.list)
        layout.addWidget(self.button)
        self.watcher = QtCore.QFileSystemWatcher(self)
        self.watcher.directoryChanged.connect(self.handleDirectoryChanged)
        self.timer = QtCore.QTimer(self)
        self.timer.setInterval(500)
        self.timer.timeout.connect(self.handleTimer)
        self.handleSetDirectory(QtCore.QDir.tempPath())

    def handleDirectoryChanged(self):
        self.timer.stop()
        print('Directory Changed')
        self._changed = True
        self.timer.start()

    def handleSetDirectory(self, directory=None):
        if not directory:
            directory = QtGui.QFileDialog.getExistingDirectory(self)
        if directory:
            self.timer.stop()
            self.watcher.removePaths(self.watcher.directories())
            self._changed = False
            self.watcher.addPath(directory)
            self.updateList()
            self.timer.start()

    def handleTimer(self):
        if self._changed:
            self._changed = False
            self.updateList()

    def updateList(self):
        print('Update List')
        self.list.clear()
        for directory in self.watcher.directories():
            self.list.addItems(os.listdir(directory))

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.resize(250, 600)
    window.show()
    sys.exit(app.exec_())

相关问题 更多 >

    热门问题