gpt4 book ai didi

python - "GUI becomes unresponsive after clicking the button"

转载 作者:行者123 更新时间:2023-12-01 01:05:19 25 4
gpt4 key购买 nike

我为我的应用程序设计了一个 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 脚本,你必须通过 bash 使用 pkill 命令来完成,因为这是启动它们的脚本。您应该在代码的哪一部分调用 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_())

关于python - "GUI becomes unresponsive after clicking the button",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55418153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com