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

问题描述:

我已经编写了一个程序,用于监视目录并在用户添加文件时发出警报,该文件具有特定的格式,如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() 

对不起,我不能重现这一个(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++对象被删除,并关闭窗口。

好了,你可以在here找到yopur答案,在阿里纳斯 我猜你的意思是,当你运行一个python文件被关闭太快了Windows打开你的终端。您可以在程序退出前添加raw_input('Press Enter to exit')。它在退出前告诉Python等待输入,也请检查here

+0

没有Shivanshu,我不是那个意思。我不是在窗户上,而且如果你仔细看我的代码,我会去做“窗口”。show()',我的意思是如果目录中的内容发生了变化,那么提示符会在它到来的时候出现,但按下ok应该不会使正在运行的实例变得安静。 –

+0

@san:“如果你仔细看我的代码,我正在做'window.show()'”?如果你打算仔细查看你自己的代码,你会发现你显然不是。 –

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

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

然后,似乎在没有显示主窗口时创建QMessageBox会导致Qt事件循环(由app.exec_()开始)在关闭QMessageBox后停止。因此,修改代码如下会造成你希望你的应用程序的行为:

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

不过,我无法解释就是为什么当为QMessageBox提示事件循环结束由app.exec_()启动事件循环将结束。如果有人有洞察力,我很想听听为什么会发生这种情况!