如何在不关闭 GUI window 的情况下停止 运行 PyQt5 程序?
How to stop running PyQt5 program without closing the GUI window?
以下代码ping 一个网站并在QTextEdit 中打印结果。一个按钮 "Run" 用于启动 ping。我想要另一个按钮 "End",它可以在 运行 时停止 ping 进程而不关闭 GUI。但目前,"End" 按钮会关闭整个 GUI window。您对如何停止 ping 但保留 GUI 有什么想法吗,这样我可以通过按 "Run" 按钮再次启动 ping。
import sys
from PyQt5 import QtCore,QtWidgets
class gui(QtWidgets.QMainWindow):
def __init__(self):
super(gui, self).__init__()
self.initUI()
def dataReady(self):
cursor = self.output.textCursor()
cursor.movePosition(cursor.End)
cursor.insertText(str(self.process.readAll()))
self.output.ensureCursorVisible()
def callProgram(self):
# run the process
# `start` takes the exec and a list of arguments
self.process.start('ping',['127.0.0.1'])
def initUI(self):
# Layout are better for placing widgets
layout = QtWidgets.QHBoxLayout()
self.runButton = QtWidgets.QPushButton('Run')
self.runButton.clicked.connect(self.callProgram)
self.runButton1 = QtWidgets.QPushButton('End')
self.runButton1.clicked.connect(self.close)
self.output = QtWidgets.QTextEdit()
layout.addWidget(self.output)
layout.addWidget(self.runButton)
layout.addWidget(self.runButton1)
centralWidget = QtWidgets.QWidget()
centralWidget.setLayout(layout)
self.setCentralWidget(centralWidget)
# QProcess object for external app
self.process = QtCore.QProcess(self)
# QProcess emits `readyRead` when there is data to be read
self.process.readyRead.connect(self.dataReady)
# Just to prevent accidentally running multiple times
# Disable the button when process starts, and enable it when it finishes
self.process.started.connect(lambda: self.runButton.setEnabled(False))
self.process.finished.connect(lambda: self.runButton.setEnabled(True))
#Function Main Start
def main():
app = QtWidgets.QApplication(sys.argv)
ui=gui()
ui.show()
sys.exit(app.exec_())
#Function Main END
if __name__ == '__main__':
main()
您必须将 clicked
信号与 QProcess
kill
插槽连接:
def initUI(self):
[...]
self.runButton1 = QtWidgets.QPushButton('End')
# self.runButton1.clicked.connect(self.close)
[...]
# QProcess object for external app
self.process = QtCore.QProcess(self)
# QProcess emits `readyRead` when there is data to be read
self.process.readyRead.connect(self.dataReady)
self.runButton1.clicked.connect(self.process.kill)
# Just to prevent accidentally running multiple times
# Disable the button when process starts, and enable it when it finishes
self.process.started.connect(lambda: self.runButton.setEnabled(False))
self.process.finished.connect(lambda: self.runButton.setEnabled(True))
以下代码ping 一个网站并在QTextEdit 中打印结果。一个按钮 "Run" 用于启动 ping。我想要另一个按钮 "End",它可以在 运行 时停止 ping 进程而不关闭 GUI。但目前,"End" 按钮会关闭整个 GUI window。您对如何停止 ping 但保留 GUI 有什么想法吗,这样我可以通过按 "Run" 按钮再次启动 ping。
import sys
from PyQt5 import QtCore,QtWidgets
class gui(QtWidgets.QMainWindow):
def __init__(self):
super(gui, self).__init__()
self.initUI()
def dataReady(self):
cursor = self.output.textCursor()
cursor.movePosition(cursor.End)
cursor.insertText(str(self.process.readAll()))
self.output.ensureCursorVisible()
def callProgram(self):
# run the process
# `start` takes the exec and a list of arguments
self.process.start('ping',['127.0.0.1'])
def initUI(self):
# Layout are better for placing widgets
layout = QtWidgets.QHBoxLayout()
self.runButton = QtWidgets.QPushButton('Run')
self.runButton.clicked.connect(self.callProgram)
self.runButton1 = QtWidgets.QPushButton('End')
self.runButton1.clicked.connect(self.close)
self.output = QtWidgets.QTextEdit()
layout.addWidget(self.output)
layout.addWidget(self.runButton)
layout.addWidget(self.runButton1)
centralWidget = QtWidgets.QWidget()
centralWidget.setLayout(layout)
self.setCentralWidget(centralWidget)
# QProcess object for external app
self.process = QtCore.QProcess(self)
# QProcess emits `readyRead` when there is data to be read
self.process.readyRead.connect(self.dataReady)
# Just to prevent accidentally running multiple times
# Disable the button when process starts, and enable it when it finishes
self.process.started.connect(lambda: self.runButton.setEnabled(False))
self.process.finished.connect(lambda: self.runButton.setEnabled(True))
#Function Main Start
def main():
app = QtWidgets.QApplication(sys.argv)
ui=gui()
ui.show()
sys.exit(app.exec_())
#Function Main END
if __name__ == '__main__':
main()
您必须将 clicked
信号与 QProcess
kill
插槽连接:
def initUI(self):
[...]
self.runButton1 = QtWidgets.QPushButton('End')
# self.runButton1.clicked.connect(self.close)
[...]
# QProcess object for external app
self.process = QtCore.QProcess(self)
# QProcess emits `readyRead` when there is data to be read
self.process.readyRead.connect(self.dataReady)
self.runButton1.clicked.connect(self.process.kill)
# Just to prevent accidentally running multiple times
# Disable the button when process starts, and enable it when it finishes
self.process.started.connect(lambda: self.runButton.setEnabled(False))
self.process.finished.connect(lambda: self.runButton.setEnabled(True))