Python &引用;点击按钮后,GUI变得无响应;

Python &引用;点击按钮后,GUI变得无响应;,python,python-3.x,multithreading,pyqt,pyqt5,Python,Python 3.x,Multithreading,Pyqt,Pyqt5,我为我的应用程序设计了一个GUI,单击一个按钮后,我连接了我的一个自定义函数,其中我调用一个bash命令来同时运行2个Python脚本。这两个脚本都是Qt应用程序。我有一个名为“Start”的按钮来运行bash命令。但我一点击按钮,两个应用程序就启动了,但我的GUI就冻结了。另外,我有一个“停止”按钮来停止这些应用程序,但是GUI冻结,我无法使用GUI做任何事情。我做错了什么 我尝试了多种同时运行两个脚本的选项,但是命令python3script1.py&python3script2.py&对我

我为我的应用程序设计了一个GUI,单击一个按钮后,我连接了我的一个自定义函数,其中我调用一个bash命令来同时运行2个Python脚本。这两个脚本都是Qt应用程序。我有一个名为“Start”的按钮来运行bash命令。但我一点击按钮,两个应用程序就启动了,但我的GUI就冻结了。另外,我有一个“停止”按钮来停止这些应用程序,但是GUI冻结,我无法使用GUI做任何事情。我做错了什么

我尝试了多种同时运行两个脚本的选项,但是命令
python3script1.py&python3script2.py&
对我来说效果很好。还有别的办法吗?
os.system()
子流程.call()
对我来说不起作用。有什么有效的方法可以做到这一点吗

这是我的UI的主要代码

class MainApp(QtWidgets.QMainWindow, mainui.Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainApp, self).__init__(parent)
        self.setupUi(self)
        self.exitapp()
        self.startApp()


    def multipleopen(self):
        self.output = subprocess.check_output(['bash', '-c', 
                      "python3 guiGO.py & python3 liveSpectogram.py &"])
    def startApp(self):
        self.start.clicked.connect(self.multipleopen)

    def exitapp(self):
      self.exit.clicked.connect(QtCore.QCoreApplication.instance().quit)
我希望通过单击“开始”按钮启动这两个应用程序,并通过单击“停止”按钮停止它。但是在点击“开始”按钮后,GUI冻结,除了关闭正在运行的应用程序和GUI窗口之外,我什么都做不了

GUI变得无响应

我必须强制退出GUI

我必须使用停止按钮手动停止脚本


函数
子进程。check_output()
正在阻塞,因此它将通过冻结应用程序来阻止GUI的事件循环执行其工作,而您应该使用
QProcess

class MainApp(QtWidgets.QMainWindow, mainui.Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainApp, self).__init__(parent)
        self.setupUi(self)

        self._process = QtCore.QProcess(self)
        self._process.readyReadStandardOutput.connect(self.on_readyReadStandardOutput)
        self._process.setProcessChannelMode(QtCore.QProcess.ForwardedChannels)
        self._process.setProgram('bash')
        self._process.setArguments(['-c', 'python3 guiGO.py & python3 liveSpectogram.py &'])

        self.exitapp()
        self.startApp()

    # read prints
    def on_readyReadStandardOutput(self):
        self.output = self._process.readAllStandardOutput()
        print(self.output)

    def startApp(self):
        self.start.clicked.connect(self._process.start)

    def exitapp(self):
        self.exit.clicked.connect(self.close)
更新:

如果要杀死python脚本,必须通过bash和pkill命令来完成,因为正是这个命令启动了python脚本。在代码的哪一部分应该调用pkill?中,一个可能的部分是closeEvent方法

from PyQt5 import QtCore, QtWidgets

class MainApp(QtWidgets.QMainWindow): #, mainui.Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainApp, self).__init__(parent)
        self.setupUi(self)

        self._scripts = ("guiGO.py", "liveSpectogram.py")
        self._processes = []
        for script in self._scripts:
            process = QtCore.QProcess(self)
            process.readyReadStandardOutput.connect(self.on_readyReadStandardOutput)
            process.setProcessChannelMode(QtCore.QProcess.ForwardedChannels)
            process.setProgram('bash')
            process.setArguments(['-c', 'python3 {}'.format(script)])
            self._processes.append(process)

        self.exitapp()
        self.startApp()

    # read prints
    def on_readyReadStandardOutput(self):
        self.output = self.sender().readAllStandardOutput()
        print(self.output)

    def startApp(self):
        for process in self._processes:
            self.start.clicked.connect(process.start)

    def exitapp(self):
        self.exit.clicked.connect(self.close)

    def closeEvent(self, event):
        for script in self._scripts:
            QtCore.QProcess.startDetached("bash", ["-c", "pkill -f {}".format(script)])
        super(MainApp, self).closeEvent(event)

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainApp()
    w.show()
    sys.exit(app.exec_())

非常感谢@eyllanesc,它就像一个符咒。我应该使用什么来终止进程
\u process.kill
不会杀死它。另外,我的“退出”按钮会关闭GUI,让两个应用程序都打开吗?我做错了什么?更新就像一个符咒。非常感谢您的时间和回答。