Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
QFileSystemModel未检测到Python生成的文件更改_Python_Qt_Pyqt_Qfilesystemmodel - Fatal编程技术网

QFileSystemModel未检测到Python生成的文件更改

QFileSystemModel未检测到Python生成的文件更改,python,qt,pyqt,qfilesystemmodel,Python,Qt,Pyqt,Qfilesystemmodel,使用PyQt和Python,我遇到了以下问题: 设置QFileSystemModel,调用setRootPath()并连接到dataChanged信号 从Python中打开一个新文件,并在其中写入一些文本。然后关上它 以追加模式重新打开文件,并在其中写入更多文本。然后关上它 在外部编辑器中打开文件。写一些东西。拯救写更多的东西。保存 如果执行(3),则不会发出dataChanged信号。但是,如果执行(4),则会发出dataChanged信号 有什么线索吗?下面包含一个重现该问题的代码段 致以最

使用PyQt和Python,我遇到了以下问题:

  • 设置QFileSystemModel,调用setRootPath()并连接到dataChanged信号
  • 从Python中打开一个新文件,并在其中写入一些文本。然后关上它
  • 以追加模式重新打开文件,并在其中写入更多文本。然后关上它
  • 在外部编辑器中打开文件。写一些东西。拯救写更多的东西。保存
  • 如果执行(3),则不会发出dataChanged信号。但是,如果执行(4),则会发出dataChanged信号

    有什么线索吗?下面包含一个重现该问题的代码段

    致以最良好的祝愿

    马德斯

    以下是一些更一般的观察结果:

    基本问题是QFileSystemModel显然没有以适当的方式监控文件更改:

    案例1(Ubuntu): 1) 在后台以“python fsm.py&”的形式运行脚本 2) 在启动脚本的目录中启动Python提示符 3) 类型:

    调用open()时,QFileSystemModel会检测到新文件。但是,未检测到由f.write()和f.close()引起的文件修改

    案例2(Ubuntu): 1) 当脚本“fsm.py”仍在运行时,使用一些外部编辑器(gedit、emacs等)打开一个新文件 2) 写一些东西并保存

    在这种情况下,新文件和修改都会被检测到。这是我不明白的第一件事。为什么检测不到Python IO,但却检测到来自编辑器的IO

    案例3(Ubuntu): 使用Ubuntu:我启动Nautilus文件浏览器,重复案例1-2中的步骤1-3。然后nautilus检测到新文件和修改。所以Python生成的IO被监控,但显然是使用GNOME文件监控系统

    案例1(Windows 7): 同样的行为

    案例2(Windows 7): 如果使用记事本或写字板,则不会检测到文件修改。如果使用GVim 7.3,则会检测到文件修改

    案例3(Windows 7): 启动本机Windows 7文件浏览器时,会检测到案例1-2中的所有MOD


    你能理解这一点吗?

    快速猜测:编辑器不会附加到文件,而是替换文件?运行该代码,我确实会更改
    数据。也许这取决于Python版本和/或操作系统。我尝试了Python 2.7、PyQt 4.9.1,Qt 4.8.1在Ubuntu上。你确定对于第三种情况,
    dataChanged
    信号没有发出吗?因为当我运行你的代码时,这是我的输出,我得到了
    dataChanged
    信号,当我试图对文件进行其他更改时,通过在记事本中编辑,没有发出
    dataChanged
    信号。如果我理解你,好吗正确地说,最初发出的
    dataChanged
    不是针对文件
    foo.dat
    。好的,但正如您所提到的,
    dataChanged
    是针对案例4发布的,但至少不是针对我。所以对我来说,
    dataChanged
    最初只发布一次,之后无论我做什么,都不会发布。@repoman:
    Modified Date
    。如果希望观察,请将视图更改为
    QTreeView
    ,并在显示窗口后修改文件(如果稍微延迟一点,效果会更好)。Python修改文件,修改日期实际上会更改,但视图不会更新。事实上,我不认为对单个文件进行监控(可能太贵了)。重命名文件会触发
    rowsRemoved
    ,然后触发
    rowsInserted
    import sys
    import os
    
    from PyQt4 import QtGui, QtCore
    
    class Widget(QtGui.QWidget):
        def __init__(self, parent=None):
            QtGui.QWidget.__init__(self, parent)
    
            layout = QtGui.QVBoxLayout()
            self.setLayout(layout)
            self._view = QtGui.QListView()
            layout.addWidget(self._view)
    
            # Add the model
            self._model = QtGui.QFileSystemModel()
            self._model.setRootPath(QtCore.QDir().rootPath())
            self._model.setReadOnly(False)
            self._model.setFilter(QtCore.QDir.AllDirs | QtCore.QDir.AllEntries)        
            self._view.setModel(self._model)
    
            # Root path
            path = os.path.dirname(os.path.abspath(__file__))
            self._model.setRootPath(path)
    
            # Set a root index
            index = self._model.index(path)
            self._view.setRootIndex(index)
    
            # Generate a file with some text
            print 'Making file'
            f = open('foo.dat', 'w')
            f.write('Some stuff\n')
            f.close()
    
            self.connect(self._model, QtCore.SIGNAL('dataChanged(const QModelIndex &, const QModelIndex &)'), self.dataChanged)
    
            # Append more text - this should trigger a signal call
            print 'Modifying file'
            f = open('foo.dat', 'w+')
            f.write('Some more stuff\n')
            f.close()
    
        def dataChanged(self, index_0, index_1):
            print 'dataChanged', self._model.filePath(index_0), self._model.filePath(index_1)
    
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
    
        widget = Widget()
        widget.show()
    
        sys.exit(app.exec_())
    
    f = open('foo.txt', 'w')
    f.write('eyeyehydhdhdhdhdhdhhdhdshshs')
    f.close()