PyQt と Python を使用して、次の問題に遭遇しました。
- QFileSystemModel をセットアップし、setRootPath() を呼び出して、dataChanged シグナルに接続します。
- Python から新しいファイルを開き、テキストを書き込みます。次に、それを閉じます。
- 追加モードでファイルを再度開き、さらにテキストを書き込みます。次に、それを閉じます。
- 外部エディターでファイルを開きます。いくつかのことを書きます。保存。もっといろいろ書いて。保存。
(3) を行うと、dataChanged シグナルは発行されません。ただし、(4) を実行すると、dataChanged シグナルが発行されます。
手がかりはありますか?問題を再現するコード スニペットを以下に示します。
よろしくお願いします、
マッツ
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_())
より一般的な観察結果を次に示します。
基本的な問題は、QFileSystemModel が明らかにファイルの変更を適切な方法で監視していないことです。
ケース 1 (Ubuntu):
1) スクリプトを「python fsm.py &」としてバックグラウンドで実行します。2) スクリプトが開始されたのと同じディレクトリで Python プロンプトを起動します。3) 次のように入力します。
f = open('foo.txt', 'w')
f.write('eyeyehydhdhdhdhdhdhhdhdshshs')
f.close()
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 が検出されます。
これで意味がわかりますか?