Задержка при установке текста метки с помощью нажатия кнопки в интерфейсе PyQt5

Я хочу подключиться к устройству telnet одним нажатием кнопки (интерфейс PyQt5). После нажатия кнопки «Подключиться» метка должна измениться на «подключение». Та же метка должна измениться на «подключено», когда соединение будет установлено. Обычно для установления соединения требуется несколько секунд, и я хочу, чтобы пользователь знал, что система пытается установить соединение. Проблема в том, что метка устанавливается на «подключение» только после установления соединения, а не сразу, поэтому, если я устанавливаю для нее значение «подключено» после установления соединения, метка обходит фазу «подключения» и переходит от ничего прямо к 'связаны'.

import sys
from PyQt5 import QtWidgets
import getstats
username='uname'
password='pword'
import telnetlib
HOST = '192.168.0.5'


class Window(QtWidgets.QWidget):

    def __init__(self):
        super().__init__()

        self.init_ui()

    def init_ui(self):
        self.b = QtWidgets.QPushButton('Connect')
        self.l = QtWidgets.QLabel('Not connected')

        h_box = QtWidgets.QHBoxLayout()
        h_box.addStretch()
        h_box.addWidget(self.l)
        h_box.addStretch()

        v_box = QtWidgets.QVBoxLayout()
        v_box.addWidget(self.b)
        v_box.addLayout(h_box)

        self.setLayout(v_box)
        self.setWindowTitle('PyQt5 Lesson 5')

        self.b.clicked.connect(self.btn_click)

        self.show()

    def btn_click(self):
        self.l.setText('connecting')
        tn_connect()

def tn_connect():
    telnet = telnetlib.Telnet(HOST)
    telnet.read_until(b"Password:")
    telnet.write((password + "\n").encode('ascii'))
    telnet.write(("exit\n").encode('ascii'))
    telnet_out = str(telnet.read_all())
    print(telnet_out)
    a_window.l.setText('connected')



app = QtWidgets.QApplication(sys.argv)
a_window = Window()
sys.exit(app.exec_())

person blitz    schedule 03.11.2017    source источник
comment
Это сработало, спасибо.   -  person blitz    schedule 03.11.2017


Ответы (1)


Чтобы принудительно обновить графический интерфейс, вы должны вызвать processEvents()

def btn_click(self):
    self.l.setText('connecting')
    QtWidgets.qApp.processEvents()
    tn_connect()
person eyllanesc    schedule 03.11.2017