简体   繁体   English

如何在不关闭 GUI 窗口的情况下停止运行 PyQt5 程序?

[英]How to stop running PyQt5 program without closing the GUI window?

The following code pings a website and prints the result in QTextEdit.以下代码 ping 一个网站并在 QTextEdit 中打印结果。 One button "Run" is used to start the ping.一键“运行”用于启动ping。 I want to have another button "End", which could stop the ping process while it is running without closing the GUI.我想要另一个按钮“结束”,它可以在不关闭 GUI 的情况下停止 ping 过程。 But currently, the "End" button closes the whole GUI window.但目前,“结束”按钮会关闭整个 GUI 窗口。 Do you have any thoughts on how to stop the ping but keep the GUI, so I can start the ping again by pressing the "Run" button.您对如何停止 ping 但保留 GUI 有任何想法,以便我可以通过按“运行”按钮再次启动 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() 

You must connect the clicked signal with the QProcess kill slot:您必须连接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))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM