1

我从另一个 StackOverflow 答案中借用了这段代码:

from PyQt4 import QtCore

@QtCore.pyqtSlot(str)
def directory_changed(path):
    print('Directory Changed!!!')

@QtCore.pyqtSlot(str)
def file_changed(path):
    print('File Changed!!!')

fs_watcher = QtCore.QFileSystemWatcher(['/path/to/files_1', '/path/to/files_2', '/path/to/files_3'])

fs_watcher.connect(fs_watcher, QtCore.SIGNAL('directoryChanged(QString)'), directory_changed)
fs_watcher.connect(fs_watcher, QtCore.SIGNAL('fileChanged(QString)'), file_changed)

问题是,file_changed无论如何,永远不会被调用。directory_changed例如,在添加文件时会可靠地调用,但更改文件内容不会导致调用 file_changed。

我调用了 的一些变体QtCore.SIGNAL('fileChanged(QString)'),例如 ,QtCore.SIGNAL('fileChanged(const QString &)')但无济于事。没有警告或错误——它根本不会触发该功能。

建议?

4

2 回答 2

5

很难确定出了什么问题,因为示例代码不完整,因此根本无法正常工作。

但是,假设您正在运行的真实代码或多或少是健全/完整的,您的问题可能是由于未将目录本身添加到路径列表中引起的。

一个基本的脚本应该是这样的:

import sys
from PyQt4 import QtCore

def directory_changed(path):
    print('Directory Changed: %s' % path)

def file_changed(path):
    print('File Changed: %s' % path)

app = QtCore.QCoreApplication(sys.argv)

paths = [
    '/path/to',
    '/path/to/files_1',
    '/path/to/files_2',
    '/path/to/files_3',
    ]

fs_watcher = QtCore.QFileSystemWatcher(paths)
fs_watcher.directoryChanged.connect(directory_changed)
fs_watcher.fileChanged.connect(file_changed)

sys.exit(app.exec_())
于 2012-11-22T21:02:19.447 回答
0
import argparse
import configparser
import os
import sys

from PyQt5 import QtCore
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QDesktopWidget, QMessageBox
from PyQt5.QtWidgets import QMainWindow

from ProgressBar_ui import Ui_Form


class ProgressBarWindow(QMainWindow, Ui_Form):
    def __init__(self):
        super().__init__()
        self.ui = Ui_Form()
        self.ui.setupUi(self)
        self.ui.progressBar.setMinimum(0)
        self.ui.progressBar.setMaximum(0)
        self.ui.progressBar.setValue(0)
        self.setWindowTitle("Progress Bar")
        self.MSversion = ""
        self.LOADING_LOG_PATH = ""
        mainIco = ("Icons\myIcon.ico")
        self.setWindowIcon(QIcon(mainIco))
        self.ui.label.setText("")
        self.ui.label.setWordWrap(True)



    def location_on_the_screen(self):
        ag = QDesktopWidget().availableGeometry()
        sg = QDesktopWidget().screenGeometry()

        widget = self.geometry()
        x = ag.width() - widget.width()
        y = 2 * ag.height() - sg.height() - widget.height()
        self.move(x, y)


    def file_changed(self, pathPassed):
        if os.path.exists(pathPassed):
            f = open(pathPassed, "r")
            for x in f:
                #print(x)
                label =x
                self.ui.label.setText(label)
                if x == "CloseLoading":
                    self.close()

def main():
    app = QApplication(sys.argv)
    w = ProgressBarWindow()
    w.setWindowFlags(w.windowFlags() & ~QtCore.Qt.WindowMaximizeButtonHint)

    parser = argparse.ArgumentParser()
    parser = argparse.ArgumentParser(description='ProgressBar Arguments')

    parser.add_argument('version', action="store", type=str)

    args = vars(parser.parse_args())

    if len(sys.argv) < 1:
        msg = QMessageBox()
        msg.setIcon(QMessageBox.Critical)
        errorMsg = "There are less than 2 command line arguments provided.\nLauncher can not be run."
        msg.setText(errorMsg)
        msg.setWindowTitle("Save paths..")
        msg.exec_()
        sys.exit()



    p= '/path/toFile/'
    paths = [ p ]

    fs_watcher = QtCore.QFileSystemWatcher(paths)
    #fs_watcher.directoryChanged.connect(w.directory_changed)
    fs_watcher.fileChanged.connect(w.file_changed)
    w.location_on_the_screen()
    w.show()
    app.exec_()

if __name__ == "__main__":
    sys.exit(main())
于 2020-02-04T14:12:40.797 回答