以下代码可ping网站,并在QTextEdit中打印结果。一键“运行”用于启动ping。我想要另一个按钮“结束”,该按钮可以在运行ping进程时停止它,而无需关闭GUI。但是目前,“结束”按钮关闭整个GUI窗口。您是否对如何停止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()

最佳答案

您必须将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))

关于python - 如何在不关闭GUI窗口的情况下停止运行PyQt5程序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46414272/

10-11 23:07
查看更多