Ich habe eine PyQt5-App, die Eingabe für den Unterprozess zu stoppen schreiben müssen.Warum python Subprocess.stdin.write() töten PyQt Gui
Allerdings tötet es auch meine PyQt5 Mainwindow
, wenn Eingangstaste verwendet wird, ohne die Subprocess-Taste zuerst zu verwenden.
Wenn ich Subprocess-Taste zuerst, und dann Eingabe-Taste verwenden, mit self.bob.stdin.write("b")
App bleibt geöffnet, aber wenn ich die Eingabetaste zuerst drücken ohne Subprocess-Taste self.bob.stdin.write("b")
drücken es tötet meine App und Hauptfenster.
Warum also self.bob.stdin.write("b")
Kill-App, und wie kann ich aufhören, mein MainWindow zu töten, wenn ich zuerst die Eingabetaste drücke?
Das Dilemma kann in diesem Testcode gesehen werden.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(308, 156)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.Button_2 = QtWidgets.QPushButton(self.centralwidget)
self.Button_2.setGeometry(QtCore.QRect(20, 40, 121, 71))
self.Button_2.setObjectName("subprocessButton_2")
self.Button_1 = QtWidgets.QPushButton(self.centralwidget)
self.Button_1.setGeometry(QtCore.QRect(170, 40, 121, 71))
self.Button_1.setObjectName("inputbutton")
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
self.Button_2.setText(_translate("MainWindow", "subprocess"))
self.Button_1.setText(_translate("MainWindow", "input"))
self.Button_2.clicked.connect(self.sub)
self.Button_1.clicked.connect(self.input)
def sub(self):
import subprocess
from subprocess import Popen, PIPE
from subprocess import Popen, PIPE
self.bob = subprocess.Popen('cmd ',stdin=PIPE, shell=True)
def input(self):
self.bob.stdin.write("q")
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
Können Sie den Code auf das minimal erforderliche Beispiel reduzieren, um das Problem zu demonstrieren? Dies erleichtert das Auffinden des Problems. –
entfernt einige Zeilen, das Minimum für App-Erstellung, und zwei Drucktasten Funktionen Wenn Sie die linke Taste drücken, und dann die rechte Taste, dann ist es in Ordnung. Aber wenn Sie links zuerst drücken, dann GUI beendet –