【问题标题】:Pyqt Terminal hangs after excuting close window commandPyqt 终端在执行关闭窗口命令后挂起
【发布时间】:2016-08-31 13:33:35
【问题描述】:

我已经在网上阅读了很多帖子,但仍然找不到解决方案。我的问题应该很简单:如何在不单击按钮或使用计时器的情况下关闭 Pyqt 窗口。 我试过的代码贴在下面

from PyQt4 import QtGui, QtCore
import numpy as np
import progressMeter_simple
import sys
import time
import pdb
class ProgressMeter(progressMeter_simple.Ui_Dialog, QtGui.QDialog):
    def __init__(self):
        QtGui.QDialog.__init__(self)
        progressMeter_simple.Ui_Dialog.__init__(self)
        self.setupUi(self)
        self.progressBar.setRange(0, 0)
        QtGui.QApplication.processEvents()
    def termination(self):
        time.sleep(5)
        self.close()
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    Dialog = ProgressMeter()
    Dialog.show()
    Dialog.termination()
    sys.exit(app.exec_())

我的 Pyqt GUI 是使用 Qt 设计器设计的,它只是一个从左到右不断移动的进度条(忙碌指示)。

但是,当我运行上面的代码时,Pyqt 窗口关闭后终端仍然挂起。 Ctrl+C 也无法终止进程。 简而言之,如何在不单击按钮或使用计时器的情况下正确关闭/终止 Pyqt 窗口?

【问题讨论】:

  • 将Progress 上的关闭信号挂钩到app.exit
  • 好吧,如果您使用QTimer,解决方案非常简单。是什么让你认为你不能使用一个?

标签: python pyqt pyqt4


【解决方案1】:

它不起作用,因为您在事件循环之外的对话框 (close()) 上调用 GUI 方法。直到您调用 app.exec_(),事件循环才会开始。

如果您真的想在对话框打开后立即关闭而不使用QTimer,您可以覆盖showEvent() 方法并从那里调用termination(),当首先显示对话框。

class ProgressMeter(progressMeter_simple.Ui_Dialog, QtGui.QDialog):
    def __init__(self):
        QtGui.QDialog.__init__(self)
        progressMeter_simple.Ui_Dialog.__init__(self)
        self.setupUi(self)
        self.progressBar.setRange(0, 0)

    def showEvent(self, event):
        super(ProgressMeter, self).showEvent(event)
        self.termination()

【讨论】:

  • 感谢您的解释。现在它更有意义了。那么有没有办法在事件循环之外关闭整个事情呢?这实际上是我想要做的。
  • 不,showEvent 直到事件循环开始之后才会被调用。要停止事件循环,它必须是从事件循环中调用的东西。
最近更新 更多