将输出从Console Live打印到QTextEdit

2024-05-14 04:32:04 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我尝试(实时)使用shell输出更新QTextEdit

txtDirb = QTextEdit()
dirb_command = "dirb" + " " + url
p = subprocess.Popen([dirb_command], stdout=subprocess.PIPE, shell=True)
out = p.stdout.read()
txtDirb.append(str(out)) # buggy!

当然,这不会更新live,而是等待整个命令执行,然后填充QTextEdit。有没有办法实现实时更新

谢谢


Tags: trueurlreadstdoutshelloutcommandsubprocess
1条回答
网友
1楼 · 发布于 2024-05-14 04:32:04

不要使用subprocess.Popen(),因为它是阻塞的,并且只在执行结束时提供结果,请使用QProcess

import sys

from PyQt5 import QtCore, QtWidgets


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.process = QtCore.QProcess(self)
        self.process.setProgram("dirb")
        self.process.setProcessChannelMode(QtCore.QProcess.MergedChannels)

        self.lineedit = QtWidgets.QLineEdit("http://webscantest.com")
        self.button = QtWidgets.QPushButton("Start")
        self.textedit = QtWidgets.QTextEdit(readOnly=True)

        lay = QtWidgets.QGridLayout(self)
        lay.addWidget(self.lineedit, 0, 0)
        lay.addWidget(self.button, 0, 1)
        lay.addWidget(self.textedit, 1, 0, 1, 2)

        self.button.clicked.connect(self.on_clicked)
        self.process.readyReadStandardOutput.connect(self.on_readyReadStandardOutput)
        self.process.finished.connect(self.on_finished)

    @QtCore.pyqtSlot()
    def on_clicked(self):
        if self.button.text() == "Start":
            self.textedit.clear()
            self.process.setArguments([self.lineedit.text()])
            self.process.start()
            self.button.setText("Stop")
        elif self.button.text() == "Stop":
            self.process.kill()

    @QtCore.pyqtSlot()
    def on_readyReadStandardOutput(self):
        text = self.process.readAllStandardOutput().data().decode()
        self.textedit.append(text)

    @QtCore.pyqtSlot()
    def on_finished(self):
        self.button.setText("Start")


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

enter image description here

相关问题 更多 >