В настоящее время я разрабатываю графический интерфейс, который запускает внешнюю функцию (называемую 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!')