我编写了一个监视目录的程序,并在用户添加文件时发出警报,该文件具有特定格式作为用户名。文件工作正常但是当我按下收到的新文件的警报时正在添加,程序退出,我希望它继续运行。
我编写的以下代码将作为该应用程序中另一个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()
答案 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的事件循环结束时结束的原因。如果有人有洞察力,我很想知道为什么会发生这种情况!