PyQt продолжает работать после закрытия окна - PullRequest
0 голосов
/ 02 мая 2018

В настоящее время я разрабатываю графический интерфейс, который запускает внешнюю функцию (называемую LinkedFunc ниже), которая печатает что-то в виджет QTextEdit. Для этого я взял поток sys.stdout и перенаправил его в виджет QTextEdit, следуя инструкциям здесь:

Распечатывать вывод консоли Python в Qtextedit

Работает как задумано, за исключением того, что когда я закрываю окно GUI - код продолжает работать бесконечно.

Когда я убиваю текущую команду, ядро, кажется, просто зависает, и мне нужно перезапустить ее, чтобы снова запустить код.

Как мне исправить это, чтобы закрыть окно, чтобы остановить программу? Перенаправление sys.stdout было самым последним дополнением к коду, и когда оно перестало закрываться, как ожидалось, поэтому я предполагаю, что это как-то связано с этим.

Я очень новичок в использовании PyQt и создании графических интерфейсов, поэтому я понимаю, что может быть что-то простое, я делаю неправильно.

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 голосов
/ 02 мая 2018

Вместо сброса значения 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...