为什么程序在我按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++对象被删除,并关闭窗口。
嗯,我不能给你一个非常满意的答案,但希望这会有所帮助。
首先,您提供的代码示例不会在QMainWindow
上调用show()
。
然后,似乎在没有显示主窗口时创建QMessageBox
会导致Qt事件循环(由app.exec_()
开始)在关闭QMessageBox
后停止。因此,修改代码如下会造成你希望你的应用程序的行为:
window = SendMyfiles()
window.show()
app.exec_()
不过,我无法解释就是为什么当为QMessageBox提示事件循环结束由app.exec_()
启动事件循环将结束。如果有人有洞察力,我很想听听为什么会发生这种情况!
没有Shivanshu,我不是那个意思。我不是在窗户上,而且如果你仔细看我的代码,我会去做“窗口”。show()',我的意思是如果目录中的内容发生了变化,那么提示符会在它到来的时候出现,但按下ok应该不会使正在运行的实例变得安静。 –
@san:“如果你仔细看我的代码,我正在做'window.show()'”?如果你打算仔细查看你自己的代码,你会发现你显然不是。 –