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

抱歉,我无法重现这个(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 回答
0

好吧,我无法为您提供非常满意的答案,但希望这会有所帮助。

首先,您提供的代码示例没有调用show().QMainWindow

然后似乎QMessageBox在没有显示主窗口时创建一个会导致 Qt 事件循环(由 开始app.exec_())在关闭后停止QMessageBox。因此,如下修改您的代码将使您的应用程序按预期运行:

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

但是,我无法解释的是为什么开始的事件循环app.exec_()会在 QMessageBox 的事件循环结束时结束。如果有人有见识,我很想听听为什么会这样!

于 2013-11-12T09:46:44.693 回答