为什么程序在我按下后退出

2024-09-30 20:22:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了一个程序,它监视一个目录,当用户添加一个文件时发出警报,该文件具有特定的格式-name.files文件它工作正常,但当我按确定的新文件被添加,程序退出收到警报,我希望它继续运行。你知道吗

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

Tags: 文件fromimportselfosmaindeffiles
3条回答

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

抱歉,我无法复制这个(OpenSUSE 12.3 x64,PyQt 4.9.6)。你知道吗

我接受了您的代码并在window.show()main()中添加了一行代码(尽管您的评论说您在“做window.show()”)。我也换了线

    userRecvdFrom = newUsrFile(".")[0]

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

前者给出一个运行时错误,因为newUsrFile是一个字符串,您不能调用它。我还更改了正在监视的目录,因为我的计算机上没有同名的目录。你知道吗

完成此操作后,我可以可靠地在被监视的文件夹中创建文件,并让程序弹出警报框。每次警报解除后,程序都保持运行。你知道吗

所以我只能推测问题出在哪里。你说你正在实例化SendMyfiles,在你选择不与我们共享的代码中,但是这个对象存在了多长时间?您是保留对这个对象的引用,还是它只存储在局部变量中,因此在方法的末尾被垃圾收集?如果您有PyQT窗口对象,并且所有引用都丢失了,Python将垃圾收集它,这将导致基础QtC++对象被删除,窗口关闭。你知道吗

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

首先,您提供的代码示例不调用QMainWindow上的show()。你知道吗

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

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

但是,我无法解释的是,当QMessageBox的事件循环结束时,app.exec_()启动的事件循环为什么会结束。如果有人有见识,我很想知道为什么会这样!你知道吗

相关问题 更多 >