当前位置: 首页 > 知识库问答 >
问题:

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

狄旻
2023-03-14

我已经编写了一个程序,它监视一个目录,并在用户添加文件时发出警报,该文件的特定格式为用户名。文件它工作正常,但当我在收到新文件被添加的警报时按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()

共有3个答案

席弘图
2023-03-14

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

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

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

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

然而,我无法解释的是为什么事件循环是由app启动的。当QMessageBox的事件循环结束时,exec()将结束。。如果有人有洞察力,我很想知道为什么会发生这种情况!

姬庆
2023-03-14

嗯,你可以在这里找到yopur的答案,我猜你是说当你运行python文件时Windows为你打开的终端关闭得太快了。您可以在程序退出之前添加raw\u输入(“按Enter键退出”)。它告诉Python在退出之前等待输入,请检查这里。

万涵亮
2023-03-14

很抱歉,我无法复制这个(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对象并关闭窗口。

 类似资料:
  • 在Flutter中,当使用< code>showDatePicker时,为什么不立即接受按下的日期值(不必按OK)? 例如,如果小部件最初在2019年9月10日打开,我想选择2019年10月5日,我希望将月份切换到10月,然后从日历显示中按5,日历显示将自动接受日期为2019年十月5日,而无需按OK按钮。 有没有办法避免按下OK按钮?

  • 我试图建立一个视频播放Android应用程序使用Kotlin。我遵循了以下教程https://www.raywenderlich.com/14273655-mediaplayer-simplifed-video-playback-on-Android 我的视频可以播放,但当我退出应用程序并重新进入它,或关闭屏幕并再次打开时,视频图像会变成黑色,尽管音频仍在播放。 我尝试使用onRestart()、

  • 问题内容: 我正在使用pushState为网站上的Ajax内容创建有意义的URL。我想在用户单击前进或后退按钮时刷新Ajax内容。但是我遇到了问题,因为Chrome(正确)在“历史记录遍历”(前进/后退按钮)和“结束”(页面加载)上都暗示了onpopstate。我想创建一个区分页面加载和历史遍历的onpopstate处理程序,因为如果已经成功加载Ajax内容,我就不希望刷新它。有人可以帮助我区分两

  • 问题内容: 我正在尝试使用Swift的内部后退按钮图像。我之前已经问过这个问题,并且得到了从上一个View继承过来的技术上正确的答案,但是如果我插入此代码,则可以控制当前View的后退按钮。 这给了我<,“ ABC”会给我ABC等,但是如何触发Swift来放置它的内部“后退按钮”图像。下面的代码不起作用,但我认为正确的做法是正确的。 有没有人知道如何做到这一点? 问题答案: 尝试将自定义视图添加为

  • 在活动A中,我可以查看。我在活动A中按下了一个编辑按钮,它启动活动B(并关闭A)。在代码中,我将带有意图的字符串从A传递到B,如下所示: 在活动A中,我有: 但是文本框是空的。 你能告诉我该如何把值从B传递回A吗?

  • 我有一个服务和一个交流的活动。当我点击按钮(我有galaxy s3,只有一个按钮)时,我的活动当然不满意,我的服务继续运行,但如果我点击后退(触摸)按钮,那么我的服务就被破坏了。我该如何改变这一点?我希望服务一直运行,直到活动破坏它。 活动: