gpt4 book ai didi

python - 如何使用 QFileSystemWatcher 只发出一个directoryChanged 信号

转载 作者:太空宇宙 更新时间:2023-11-03 17:55:11 32 4
gpt4 key购买 nike

这是我的应用程序的基本前提:

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

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

我过去使用过 QFileSystemWatcher,它总是工作得很好(对于目录和文件更改)。

应用程序将显示\Images 文件夹中图像的幻灯片。当新图像放置在\Images 文件夹中时,幻灯片将重置以包含新图像。如果从\Images 文件夹中删除图像,幻灯片将再次重置。

我遇到的问题是:如果我将多个图像拖到\Images 文件夹中,则会多次触发 directoryChanged 信号。信号被触发,并且为添加到文件夹的每个图像运行相应的 UpdateImages() 例程,即使它们是同时添加的(即选择多个图像,将它们拖放到\Images 中)。

这对我的日常生活造成了严重破坏。有没有办法为一批目录更改触发一次directoryChanged 信号? IE。在最终图像添加到目录之前我可以禁用信号吗?

非常感谢!

最佳答案

解决方案是简单地避免将 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_())

关于python - 如何使用 QFileSystemWatcher 只发出一个directoryChanged 信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28571899/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com