Записать результат pingа в QLabel

Есть код:

import sys
from PyQt5.Qt import *


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        centralWidget = QWidget()                    
        self.setCentralWidget(centralWidget)
        
        self.runButton = QPushButton('Start')
        self.runButton.clicked.connect(self.callProgram)

        self.textEdit = QTextEdit()

        layout = QHBoxLayout(centralWidget)
        layout.addWidget(self.textEdit)
        layout.addWidget(self.runButton)

        # Объект QProcess для внешнего приложения
        self.process = QProcess(self)
        # QProcess выдает `readyRead`, когда есть данные для чтения !!!
        self.process.readyRead.connect(self.dataReady)
        
        self.timer = QTimer(self, interval=5000)    # установите нужный вам интервал
        self.timer.timeout.connect(self.on_timeout)

    def dataReady(self):
        cursor = self.textEdit.textCursor()
        cursor.movePosition(cursor.End)
        cursor.insertText( self.process.readAll().data().decode("cp866") )  
        self.textEdit.ensureCursorVisible()
        
    def on_timeout(self): 
        # запустить процесс
        # `start` принимает exec и список аргументов
        #self.process.start('ping', ['127.0.0.1'])
        self.process.start('ping', ['ru.stackoverflow.com'])    

    def callProgram(self):
        if self.runButton.text()  == 'Start':
            self.runButton.setText('Stop')
            self.timer.start()
        else:
            self.timer.stop()
            self.runButton.setText('Start')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MainWindow()
    w.resize(600, 300)
    w.show()
    sys.exit(app.exec_())

Можно ли сделать вместо вывода содержимого в QtTextEdit просто указывать в QLabel если пинг есть то Подключен, если нет пинга Не подключен


Ответы (1 шт):

Автор решения: S. Nick

Попробуйте так:

import sys
from PyQt5.Qt import *


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        centralWidget = QWidget()                    
        self.setCentralWidget(centralWidget)
        
        self.runButton = QPushButton('Start')
        self.runButton.clicked.connect(self.callProgram)

        self.label = QLabel()

        layout = QVBoxLayout(centralWidget)
        layout.addWidget(self.label, alignment=Qt.AlignCenter)
        layout.addWidget(self.runButton)


        self.process = QProcess(self)
        
        # QProcess выдает `readyRead`, когда есть данные для чтения 
        # self.process.readyRead.connect(self.dataReady)
        
        # https://doc.qt.io/qt-5/qprocess.html#finished
        self.process.finished.connect(self.on_finished)                    # +++ 
        
        # или так
        # self.ipAddress = '151.101.129.69'                                # +++ 
        # или так
        self.ipAddress = 'ru.stackoverflow.com'                            # +++ 
        
        self.timer = QTimer(self, interval=5000)  # установите нужный вам интервал
        self.timer.timeout.connect(self.on_timeout)

    @pyqtSlot(int, QProcess.ExitStatus)                                    # +++ 
    def on_finished(self, exitCode, exitStatus):                           # +++ 
        #print(f"exitCode=`{exitCode}`, exitStatus=`{exitStatus}`")
        if exitCode == 0:
            text = '<span style="color: green; font-size: 20px;">Подключен</span>'
        else:
            text = '<span style="color: red; font-size: 20px;">НЕ подключен</span>' 
        self.label.setText(f'Ping для {self.ipAddress}: {text}')           # +++
        self.label.adjustSize()

#    def dataReady(self):
#        cursor = self.textEdit.textCursor()
#        cursor.movePosition(cursor.End)
#        cursor.insertText( self.process.readAll().data().decode("cp866") )  
#        self.textEdit.ensureCursorVisible()
        
    def on_timeout(self): 
        # запустить процесс
        # `start` принимает exec и список аргументов
        #self.process.start('ping', ['127.0.0.1'])
        #self.process.start('ping', ['ru.stackoverflow.com', '-n', '2', '-w', '100'])  
        self.process.start('ping', [self.ipAddress, '-n', '2', '-w', '100'])  

    def callProgram(self):
        if self.runButton.text()  == 'Start':
            self.runButton.setText('Stop')
            self.timer.start()
        else:
            self.timer.stop()
            self.runButton.setText('Start')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MainWindow()
    w.resize(600, 300)
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка