簡體   English   中英

“單擊按鈕后GUI變得無響應”

[英]“GUI becomes unresponsive after clicking the button”

我為我的應用程序設計了一個GUI,單擊按鈕后,我連接了我的自定義函數,在其中調用bash命令以同時運行2個Python腳本。 這兩個腳本都是Qt應用程序。 我有一個名為“開始”的按鈕來運行bash命令。 但是,一旦單擊按鈕,兩個應用程序都啟動,但我的GUI凍結。 另外,我有一個“停止”按鈕來停止這些應用程序,但是GUI凍結,並且我無法使用GUI進行任何操作。 我究竟做錯了什么?

我嘗試了多種選項來同時運行2個腳本,但是命令python3 script1.py & python3 script2.py &對我來說很好用。 還有其他方法嗎? os.system()subprocess.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

我必須使用“停止”按鈕手動停止腳本

subprocess.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腳本,則必須使用pkill命令通過bash進行,因為這是啟動它們的腳本。 您應該在代碼的哪一部分叫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_())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM