我目前正在设计一个运行外部函数的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!')
答案 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()