python实现:将cmd窗口连续不断的输出,立刻打印在QPlainTextEdit窗口
时间: 2024-06-11 12:05:21 浏览: 143
py代码-QPlainTextEdit运用
这里给出一个简单的示例,使用Python的subprocess模块来捕获cmd窗口的输出,并使用PyQt5的QPlainTextEdit来实时显示输出结果:
```python
import sys
import subprocess
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPlainTextEdit
from PyQt5.QtCore import QProcess, QIODevice, QByteArray, QObject, pyqtSlot
class CmdProcess(QObject):
def __init__(self, parent=None):
super().__init__(parent)
self.process = QProcess(self)
self.process.setProgram('cmd.exe')
self.process.readyReadStandardOutput.connect(self.on_readyReadStandardOutput)
self.process.start()
def on_readyReadStandardOutput(self):
data = self.process.readAllStandardOutput()
text = data.data().decode('gbk')
self.output(text)
@pyqtSlot(str)
def input(self, cmd):
self.process.write(cmd.encode('gbk'))
output = pyqtSlot(str)
class Window(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.textEdit = QPlainTextEdit(self)
self.textEdit.setReadOnly(True)
vbox = QVBoxLayout()
vbox.addWidget(self.textEdit)
self.setLayout(vbox)
self.cmdProcess = CmdProcess()
self.cmdProcess.output.connect(self.on_output)
self.textEdit.textChanged.connect(self.text_changed)
@pyqtSlot()
def text_changed(self):
if self.textEdit.toPlainText().endswith('\n'):
cmd = self.textEdit.toPlainText().split('\n')[-2] + '\n'
self.cmdProcess.input(cmd)
@pyqtSlot(str)
def on_output(self, text):
self.textEdit.moveCursor(QPlainTextEdit.End)
self.textEdit.insertPlainText(text)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
```
在这个示例中,我们创建了一个名为CmdProcess的QObject子类,用于捕获cmd窗口的输出,并将输出结果通过信号传递给主窗口的QPlainTextEdit控件。在主窗口中,我们通过监听QPlainTextEdit的textChanged信号来捕获用户在控件中输入的命令,并将命令通过CmdProcess的input()方法发送给cmd窗口。同时,我们也监听CmdProcess的output信号来实时显示cmd窗口的输出结果。
需要注意的是,由于cmd窗口输出的编码通常是gbk,而PyQt5默认使用UTF-8编码,因此我们需要将输出结果转换为gbk编码后再进行显示。
阅读全文