1

ディレクトリを監視し、ファイルがユーザーによって追加されたときに警告するプログラムを作成しました。ファイルは user-name.files として特定の形式を持ち、正常に動作しますが、新しいファイルが追加されたという警告を受け取って [OK] を押すと、プログラムは終了しますが、実行し続けたいです。

私が書いた以下のコードは、そのアプリケーション内の別の PYQT アプリケーションの子プロセスとして実行されます。そのため、main() を実行するのではなく、SendMyFiles オブジェクトをインスタンス化するだけです。

from PyQt4 import QtGui,QtCore
from PyQt4.QtCore import pyqtSlot
import sys
import os

class SendMyfiles(QtGui.QMainWindow):
    def __init__(self):
        super(SendMyfiles, self).__init__()
        self._lookInPath = "/Users/krystosan"
        self.filesList = os.listdir(self._lookInPath)
        print self.filesList
        self.watchMyfilesBin()

    def watchMyfilesBin(self):
        self.fileSysWatcher = QtCore.QFileSystemWatcher()
        self.fileSysWatcher.addPath(self._lookInPath)
        QtCore.QObject.connect(self.fileSysWatcher,QtCore.SIGNAL("directoryChanged(QString)"), self,       
            QtCore.SLOT("slotDirChanged(QString)")) 
        # get list of files as files
        self.newFilesList = os.listdir(self._lookInPath)


    def _connections(self):
        pass

    def recievedfilesFromUser(self):
        newUsrFile =  list(set(os.listdir(self._lookInPath))^set(self.filesList))[0]
        userRecvdFrom = newUsrFile.split(".")[0]
        self.filesList.append(newUsrFile)
        return userRecvdFrom

    @pyqtSlot("QString")   
    def slotDirChanged(self, userfiles):
        userName = self.recievedfilesFromUser()
        retVal = QtGui.QMessageBox.about(self, "Hello %s" % os.getenv('USER'), "Recieved files from %s." % userName)


def main():
    app     = QtGui.QApplication(sys.argv)
    fileSysWatcher  = QtCore.QFileSystemWatcher() 
    window    = SendMyfiles()  
    app.exec_()

if __name__ == '__main__':
    main()
4

3 に答える 3

0

まあ、あなたはここでyopurの答えを見つけることができます.補足として、pythonファイルを実行したときにWindowsが開くターミナルがあまりにも速く閉じられていることを意味していると思います. raw_input('Press Enter to exit')プログラムが終了する直前に追加できます。終了する前に入力を待つよう Python に指示します。こちらも確認してください。

于 2013-11-10T05:47:01.467 に答える
0

あまり満足のいく回答はできませんが、参考になれば幸いです。

まず、あなたが提供したコード例show()QMainWindow.

QMessageBox次に、メイン ウィンドウが表示されていないときにを作成するとapp.exec_()、 が閉じられると Qt イベント ループ ( によって開始される) が停止するように見えますQMessageBox。したがって、コードを次のように変更すると、アプリケーションは期待どおりに動作します。

window    = SendMyfiles()  
window.show()
app.exec_()

ただし、説明できないのはapp.exec_()、QMessageBox のイベント ループが終了すると、開始されたイベント ループが終了する理由です。誰かが洞察を持っているなら、なぜこれが起こるのか聞いてみたいです!

于 2013-11-12T09:46:44.693 に答える
0

申し訳ありませんが、これを再現できません (OpenSUSE 12.3 x64、PyQt 4.9.6)。

私はあなたのコードを取り、(あなたが「やっている」と言っているコメントにもかかわらず)に行window.show()を追加しました。ラインも交換しましたmain()window.show()

    userRecvdFrom = newUsrFile(".")[0]

    userRecvdFrom = newUsrFile.split(".")[0]

前者はnewUsrFile文字列であり、呼び出すことができないため、実行時エラーが発生します。マシンにその名前のディレクトリがないため、監視対象のディレクトリも変更しました。

これを行った後、監視されているフォルダーにファイルを確実に作成し、プログラムに警告ボックスをポップアップさせることができました. 各アラートが解除された後も、プログラムは実行され続けました。

したがって、何が問題なのかを推測することしかできません。あなたはSendMyfiles私たちと共有しないことを選択したコードで をインスタンス化していると言いますが、このオブジェクトはどのくらいの期間存在し続けますか? このオブジェクトへの参照を保持しますか?それとも、ローカル変数にのみ格納されているため、メソッドの最後でガベージ コレクションが行われますか? PyQt ウィンドウ オブジェクトがあり、それへのすべての参照が失われると、Python はそれをガベージ コレクションします。これにより、基礎となる Qt C++ オブジェクトが削除され、ウィンドウが閉じられます。

于 2013-11-10T10:21:08.330 に答える