У меня есть приложение PyQt5, которое должно записывать ввод для подпроцесса для остановки.Почему python Subprocess.stdin.write() убивает PyQt Gui
Однако он также убивает мой PyQt5 Mainwindow
, если кнопка ввода используется без первой кнопки подпроцесса.
Если я сначала использую кнопку подпроцесса, а затем использую кнопку ввода, то приложение self.bob.stdin.write("b")
остается открытым, но если я сначала нажимаю кнопку ввода, не нажимая кнопку подпроцесса self.bob.stdin.write("b")
, она убивает мое приложение и Mainwindow.
Так почему же self.bob.stdin.write("b")
убить приложение, и как я могу остановить его от убийства моего MainWindow, если я сначала нажимаю кнопку ввода?
Дилемму можно увидеть в этом тестовом коде.
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_())
Можете ли вы уменьшить код до минимально необходимого примера, чтобы продемонстрировать проблему? Это облегчает поиск проблемы. –
удалил несколько строк, минимум для создания приложений и двух кнопок. Если вы нажмете левую кнопку, а затем правую кнопку, тогда все будет в порядке. Но если вы нажмете сначала влево, тогда GUI завершает –