【问题标题】:why the program exits after i press Ok为什么我按确定后程序退出
【发布时间】:2013-11-10 05:33:52
【问题描述】:

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

【问题讨论】:

    标签: python qt pyqt qfilesystemwatcher


    【解决方案1】:

    抱歉,我无法重现这个(OpenSUSE 12.3 x64,PyQt 4.9.6)。

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

        userRecvdFrom = newUsrFile(".")[0]
    

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

    前者给出了运行时错误,因为newUsrFile 是一个字符串,你不能调用它。我还更改了正在监视的目录,因为我的机器上没有具有该名称的目录。

    完成此操作后,我可以可靠地在正在监视的文件夹中创建文件并让程序弹出警报框。在每个警报被解除后,程序继续运行。

    所以我只能推测问题可能是什么。你说你正在实例化SendMyfiles,在你选择不与我们分享的代码中,但是这个对象会存在多久?您是否保留对该对象的引用,或者它是否仅存储在局部变量中并因此在方法结束时被垃圾收集?如果你有一个 PyQt 窗口对象,并且对它的所有引用都丢失了,Python 将垃圾收集它,这将导致底层 Qt C++ 对象被删除并关闭窗口。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 不是 Shivanshu,我不是那个意思。我不在 Windows 上,此外,如果您仔细查看我的代码,我正在做 window.show(),我的意思是如果目录中发生了变化,那么提示应该会出现,但按下 ok 不应该让运行停止实例。
      • @san:“如果你仔细看我的代码,我在做window.show()”?如果您仔细查看自己的代码,您会发现您很明显不是。
      【解决方案3】:

      好吧,我无法为您提供非常满意的答案,但希望这会有所帮助。

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        相关资源
        最近更新 更多