从命令行运行的PyQt程序不会实时路由控制台输出

时间:2017-11-30 06:11:43

标签: python python-2.7 pyqt4

嗨,我是PyQt的新手。 有人可以建议为什么下面的程序没有实时填充print.py的stdout到文本框小部件。当它从命令行运行时存在这个问题。如果我们在pycharm中运行相同的代码,我们将获得实时输出。命令行执行将数据显示为文本框的块(约4K)。

from PyQt4 import QtGui,QtCore
import sys

class gui(QtGui.QMainWindow):
    def __init__(self):
        super(gui, self).__init__()
        self.initUI()

    def dataReady(self):
        cursor = self.output.textCursor()
        cursor.movePosition(cursor.End)
        cursor.insertText(str(self.process.readAll()))
        self.output.ensureCursorVisible()

    def initUI(self):
        # Layout are better for placing widgets
        layout = QtGui.QHBoxLayout()
        self.output = QtGui.QTextEdit()

        layout.addWidget(self.output)

        centralWidget = QtGui.QWidget()
        centralWidget.setLayout(layout)
        self.setCentralWidget(centralWidget)

        # QProcess object for external app
        self.process = QtCore.QProcess(self)
        # QProcess emits `readyRead` when there is data to be read
        self.process.readyRead.connect(self.dataReady)

        # Run program
        self.process.start('python', ['./print.py'])

#Function Main Start
def main():
    app = QtGui.QApplication(sys.argv)
    ui=gui()
    ui.show()
    sys.exit(app.exec_())
#Function Main END

if __name__ == '__main__':
    main()

以下是print.py

的代码
import time
n=10
while(n):
    print "Hello world"
    time.sleep(1)
    n = n-1

1 个答案:

答案 0 :(得分:1)

您应该显式刷新在子进程中运行的print.py脚本(子脚本)的输出缓冲区。 print的默认行为是将输出发送到标准输出(stdout)。因此,您应该在每个print语句之后在子脚本中显式调用sys.sydout.flush(),以确保子脚本中的print语句的内容及时可用于父脚本。