为什么程序在按下确定后退出

时间:2013-11-10 05:33:52

标签: python qt pyqt qfilesystemwatcher

我编写了一个监视目录的程序,并在用户添加文件时发出警报,该文件具有特定格式作为用户名。文件工作正常但是当我按下收到的新文件的警报时正在添加,程序退出,我希望它继续运行。

我编写的以下代码将作为该应用程序中另一个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()

3 个答案:

答案 0 :(得分:0)

嗯,你可以在旁边的here找到yopur的回答 我想你的意思是,当你运行python文件时,Windows为你打开的终端关闭得太快了。您可以在程序退出之前添加raw_input('Press Enter to exit')。它告诉Python在退出之前等待输入,请同时检查here

答案 1 :(得分: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 ++对象并关闭窗口。

答案 2 :(得分:0)

嗯,我不能给你一个非常满意的答案,但希望这会有所帮助。

首先,您提供的代码示例不会在show()上调用QMainWindow

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

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

但是,我无法解释的是,app.exec_()启动的事件循环在QMessageBox的事件循环结束时结束的原因。如果有人有洞察力,我很想知道为什么会发生这种情况!