如何在 PyQt5 中捕获标准输入

问题描述 投票:0回答:0

我正在尝试使用 PyQt5 为 AI 助手制作一个简单的图形用户界面。到目前为止,我能够将标准输出重定向到 QPlainTextEdit 而不是终端。但是当主程序要求输入时(如图)我无法捕获它。(https://i.stack.imgur.com/ELhxr.png

techna.py

from PyQt5 import QtCore, QtWidgets, QtGui 
from PyQt5.QtGui import QMovie, QTextBlock
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from gui.technaui2 import Ui_technaui2
import sys 
import techna2


class MainThread(QThread):
    def __init__(self):
        super(MainThread, self).__init__()

    def run(self):
        self.TaskGui()

    def TaskGui(self):
        while True:
            techna2.Main()


startFunction = MainThread()


class GuiStart(QMainWindow):
    def __init__(self):
        super().__init__()

        self.technaui2 = Ui_technaui2()
        self.technaui2.setupUi(self)
        self.technaui2.pushButton.clicked.connect(self.startFunc)
        self.technaui2.pushButton_2.clicked.connect(self.close)
        sys.stdout = EmittingStream(textWritten=self.normalOutputWritten)

    def __del__(self):
        # Restore sys.stdout
        sys.stdout = sys.__stdout__

    def normalOutputWritten(self, text):
        """Append text to the QTextEdit."""
        cursor = self.technaui2.textEdit.textCursor()
        cursor.movePosition(QtGui.QTextCursor.End)
        cursor.insertText(text)
        self.technaui2.textEdit.setTextCursor(cursor)
        self.technaui2.textEdit.ensureCursorVisible()

    def startFunc(self):
        self.technaui2.movies = QtGui.QMovie(
            "C:\\Users\\Hp\\Desktop\\SP\\techna2\\gui\\images\\gif\\ai2.gif"
        )
        self.technaui2.gif.setMovie(self.technaui2.movies)
        self.technaui2.movies.start()

        startFunction.start()


class EmittingStream(QtCore.QObject):
    textWritten = QtCore.pyqtSignal(str)

    def write(self, text):
        self.textWritten.emit(str(text))


guiApp = QApplication(sys.argv)

guiTechna = GuiStart()

guiTechna.show()

exit(guiApp.exec_())

technaui2.py

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *

import sys


class Ui_technaui2(object):
    def setupUi(self, technaui2):
        technaui2.setObjectName("technaui2")
        technaui2.resize(1000, 800)
        self.centralwidget = QtWidgets.QWidget(technaui2)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(-6, -1, 651, 411))
        self.label.setText("")
        self.label.setPixmap(
            QtGui.QPixmap(
                "C:\\Users\\Hp\\Desktop\\SP\\techna2\\gui\\images\\use\\bg.webp"
            )
        )
        self.label.setScaledContents(True)
        self.label.setObjectName("label")
        self.gif = QtWidgets.QLabel(self.centralwidget)
        self.gif.setGeometry(QtCore.QRect(147, 0, 321, 261))
        self.gif.setStyleSheet("border : 1px solid purple;")
        self.gif.setText("")
        self.gif.setPixmap(
            QtGui.QPixmap(
                "C:\\Users\\Hp\\Desktop\\SP\\techna2\\gui\\images\\gif\\ai2.gif"
            )
        )
        self.gif.setScaledContents(True)
        self.gif.setObjectName("gif")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(675, 330, 111, 51))
        self.pushButton.setStyleSheet(
            'font: 16pt "Modern No. 20";\n'
            "background-color: rgb(0, 0, 0);\n"
            "color: rgb(255, 255, 255);\n"
            "color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(0, 61, 162, 255), stop:1 rgba(255, 255, 255, 255));\n"
            "border : 1px solid;\n"
            "border-color: rgb(170, 85, 255);"
        )
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(675, 400, 111, 51))
        self.pushButton_2.setStyleSheet(
            'font: 16pt "Modern No. 20";\n'
            "\n"
            "background-color: rgb(0, 0, 0);\n"
            "color: rgb(255, 255, 255);\n"
            "color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(0, 61, 162, 255), stop:1 rgba(255, 255, 255, 255));\n"
            "border : 1px solid;\n"
            "border-color: rgb(170, 0, 255);"
        )
        self.pushButton_2.setObjectName("pushButton_2")

        self.textEdit = QtWidgets.QPlainTextEdit(self.centralwidget)
        self.textEdit.setGeometry(QtCore.QRect(0, 500, 651, 211))
        self.textEdit.setObjectName("textEdit")
        technaui2.setCentralWidget(self.centralwidget)
        self.textEdit.setStyleSheet(
            'font: 12pt "Modern No. 10";\n'
            "background-color: rgb(0, 0, 0);\n"
            "color: rgb(255, 255, 255);\n"
            "padding-left: 30px;\n"
        )

        self.label.resize(1006, 800)
        self.gif.resize(700, 500)
        self.pushButton.resize(140, 70)
        self.pushButton_2.resize(140, 70)
        self.textEdit.resize(1000, 300)

        self.retranslateUi(technaui2)
        QtCore.QMetaObject.connectSlotsByName(technaui2)

    def retranslateUi(self, technaui2):
        _translate = QtCore.QCoreApplication.translate
        technaui2.setWindowTitle(_translate("technaui2", "TECHnA"))
        technaui2.setWindowIcon(
            QtGui.QIcon(
                "C:\\Users\\Hp\\Desktop\\SP\\techna2\\gui\\images\\Difference-between-AI-and-Neural-Network-768x614.jpg"
            )
        )
        self.pushButton.setText(_translate("technaui2", "START"))
        self.pushButton_2.setText(_translate("technaui2", "STOP"))


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    technaui2 = QtWidgets.QMainWindow()
    ui = Ui_technaui2()
    ui.setupUi(technaui2)
    technaui2.show()
    sys.exit(app.exec_())

如何捕获用户的输入并将其返回给正在运行的程序?

python input pyqt5 artificial-intelligence stdin
© www.soinside.com 2019 - 2024. All rights reserved.