I have written a program that watches over a directory and alerts when a file is added by a user, the file has specific format as user-name.files it works fine but when I press ok of the alert received of new file being added, the program exits, I want it it to stay running.
The below code I have written will run as child process of another PYQT application within that application. So in that I won't be executing main() but will just instantiate SendMyFiles object.
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()
Sorry, I cannot reproduce this one (OpenSUSE 12.3 x64, PyQt 4.9.6).
I took your code and added a line
window.show()tomain()(despite your comment saying that you were "doingwindow.show()"). I also replaced the linewith
The former gives a runtime error because
newUsrFileis a string and you can't call it. I also changed the directory being watched as I don't have a directory with that name on my machine.After doing this, I could reliably create files in the folder being watched and have the program pop up alert boxes. After each alert was dismissed the program stayed running.
So I can only speculate at what the problem might be. You say you are instantiating
SendMyfiles, in code that you have chosen not to share with us, but how long does this object stay in existence for? Do you keep a reference to this object, or is it only stored in a local variable and hence gets garbage collected at the end of a method? If you have a PyQt window object, and all references to it are lost, Python will garbage-collect it, which will cause the underlying Qt C++ object to be deleted and the window closed.