窗口关闭后,PyQt继续运行

时间:2018-05-02 04:57:32

标签: python pyqt pyqt5

我目前正在设计一个运行外部函数的GUI(下面称为LinkedFunc),它将某些东西打印到QTextEdit小部件中。为此,我按照sys.stdout流并将其重定向到QTextEdit小部件,按照此处的说明进行操作:

Print out python console output to Qtextedit

它按预期工作,除了当我关闭GUI窗口时 - 代码会无限期地运行。

当我终止当前命令时,内核似乎只是挂起,我必须重新启动才能再次运行代码。

如何解决这个问题,以便关闭窗口会停止程序?重定向sys.stdout是代码的最新添加,并且当它按预期停止关闭时,所以我认为它与此有关。

我是使用PyQt和构建GUI的新手,所以我意识到可能有一些简单的我做错了。

import sys
import LinkedFunc
from PyQt5.QtWidgets import QMainWindow, QPushButton, QApplication, QFileDialog, QTextEdit
from PyQt5 import QtCore, QtGui


class Stream(QtCore.QObject):
    newText = QtCore.pyqtSignal(str)

    def write(self, text):
        self.newText.emit(str(text))


class GenOutput(QMainWindow):

    def __init__(self):
        super().__init__()

        self.initUI()

        # Custom output stream.
        sys.stdout = Stream(newText=self.onUpdateText)

    def onUpdateText(self, text):
        # Print to text box widget.
        cursor = self.process.textCursor()
        cursor.movePosition(QtGui.QTextCursor.End)
        cursor.insertText(text)
        self.process.setTextCursor(cursor)
        self.process.ensureCursorVisible()

    def __del__(self):
        # Return stdout to defaults.
        sys.stdout = sys.__stdout__

    def initUI(self):

        # Button for generating the master list.
        btnGenOutput = QPushButton("Generate Output", self)
        btnGenOutput.move(30, 50)

        # Link the buttons to their function calls.
        btnGenOutput.clicked.connect(self.genOutputClicked)

        # Create the output widget.
        self.process = QTextEdit(self, readOnly=True)
        self.process.ensureCursorVisible()
        self.process.setLineWrapColumnOrWidth(500)
        self.process.setLineWrapMode(QTextEdit.FixedPixelWidth)
        self.process.setFixedWidth(400)
        self.process.setFixedHeight(150)
        self.process.move(30, 100)

        # Set window size and title, then show the window.
        self.setGeometry(300, 300, 500, 300)
        self.setWindowTitle('Test Application')
        self.show()

    def genOutputClicked(self):
        # Run the GenerateMaster.py file.
        LinkedFunc.main()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    gui = GenOutput()
    sys.exit(app.exec_())

LinkedFunc简单如下:

def main():

    print('Hello world!')

1 个答案:

答案 0 :(得分:0)

您可以使用sys.stdout方法重置__del__方法中closeEvent的值。

class GenOutput(QMainWindow):

    def __init__(self):
        super().__init__()
        self.initUI()
        sys.stdout = Stream(newText=self.onUpdateText)

    def onUpdateText(self, text):
        # Print to text box widget.
        ...

    def closeEvent(self, event):
        # Return stdout to defaults.
        sys.stdout = sys.__stdout__
        super().closeEvent(event)

    def initUI(self):
        ...

    def genOutputClicked(self):
        # Run the GenerateMaster.py file.
        LinkedFunc.main()