как подключить stdin подпроцесса к qlineedit в python - PullRequest
1 голос
/ 25 февраля 2020

Я создаю своего рода терминал в pyqt5, из которого вы можете запустить файл python из него, и он покажет вам вывод.

это мой код

import sys
from subprocess import Popen,PIPE

from PyQt5.QtWidgets import (QApplication,QWidget,QVBoxLayout,
                             QHBoxLayout,QPlainTextEdit,QLabel,
                             QLineEdit)

class Terminal(QWidget):
    def __init__(self):
        super().__init__()
        lay = QHBoxLayout()
        layout = QVBoxLayout()
        self.setLayout(layout)

        self.out = QPlainTextEdit()
        self.inLbl = QLabel('')
        self.inBar = QLineEdit()

        lay.addWidget(self.inLbl)
        lay.addWidget(self.inBar)

        layout.addWidget(self.out)
        layout.addLayout(lay)
    def runFile(self,url):
        self.out.clear()
        p = Popen(['python',url],stdout = PIPE,stderr = PIPE)
        stdout,stderr = p.communicate()
        err = stderr.decode()

        self.out.insertPlainText(stdout.decode())

        if err != '':
            self.out.insertPlainText('\n'+stderr.decode())

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Terminal()
    window.runFile('test.py')
    window.show()
    sys.exit(app.exec_())

и это test.py:

print('Hello '+name+'.')

Я хочу, чтобы, когда терминал запускает файл, self.inLbl изменяется на строку входной команды, а self.inBar получает ввод и возвращает ввод, а self.out записывает текст self.inLbl. плюс входная строка. Как я могу это сделать?

1 Ответ

2 голосов
/ 25 февраля 2020

В этом случае лучше использовать QProcess вместо subprocess.Popen (), поскольку его можно легко записать с помощью метода write (). С другой стороны, test.py необходимо изменить, чтобы он мог получать информацию, использовать входную или аналогичную функцию:

import sys

from PyQt5 import QtCore, QtWidgets


class Terminal(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()

        self.out = QtWidgets.QPlainTextEdit(readOnly=True)
        self.inBar = QtWidgets.QLineEdit()

        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.out)
        layout.addWidget(self.inBar)

        self.process = QtCore.QProcess(self)
        self.process.setProgram(sys.executable)
        self.process.readyReadStandardOutput.connect(self.on_readyReadStandardOutput)
        self.process.readyReadStandardError.connect(self.on_readyReadStandardError)
        self.inBar.editingFinished.connect(self.on_editingFinished)

    def runFile(self, url):
        self.process.setArguments([url])
        self.process.start()

    @QtCore.pyqtSlot()
    def on_readyReadStandardOutput(self):
        out = self.process.readAllStandardOutput().data().decode()
        self.out.insertPlainText(out)

    @QtCore.pyqtSlot()
    def on_readyReadStandardError(self):
        err = self.process.readAllStandardError().data().decode()
        self.out.insertPlainText("\n" + err)

    @QtCore.pyqtSlot()
    def on_editingFinished(self):
        self.process.write(self.inBar.text().encode() + b"\n")
        self.inBar.clear()


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = Terminal()
    window.runFile("test.py")
    window.show()
    sys.exit(app.exec_())

test.py

while True:
    name = input()
    print('Hello '+name+'.')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...