Страницы

Поиск по вопросам

воскресенье, 9 июня 2019 г.

Не отображается текст виджета QLineEdit с задержкой time.sleep

Пользователь вводит букву в поле виджета QLineEdit, затем через секунду поле должно очиститься. Пауза работает, но текст не появляется. Как это сделать можно?
import sys, time from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QVBoxLayout
class MyWindow(QWidget): def __init__(self, parent=None): QWidget.__init__(self, parent) self.qle = QLineEdit() self.qle.textEdited.connect(self.method)
self.vbox = QVBoxLayout() self.vbox.addWidget(self.qle) self.setLayout(self.vbox)
def method(self): time.sleep(2) self.qle.clear()
if __name__ == "__main__": app = QApplication(sys.argv) window = MyWindow() window.resize(300, 70) window.show() sys.exit(app.exec_())


Ответ

Когда вы используете петлю обработки событий QApplication, не стоит пользоваться питоновским\системным sleep. В Qt есть для этого QTimer. В данном случае можно использовать статический метод singleShot. Он принимает параметры задержки в мс и слот-обработчик.
import sys from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QVBoxLayout from PyQt5.QtCore import QTimer
class MyWindow(QWidget): def __init__(self): super().__init__() qle = QLineEdit() qle.textEdited.connect(lambda: QTimer.singleShot(2000, qle.clear))
vbox = QVBoxLayout() vbox.addWidget(qle) self.setLayout(vbox)
if __name__ == "__main__": app = QApplication(sys.argv) window = MyWindow() window.resize(300, 70) window.show() sys.exit(app.exec_())
В вашем же случае получалось, что time.sleep блокировал поток выполнения (поэтому текст не появлялся), через 2 секунды управление возвращалось приложению, происходила очистка текстового поля виджета, перерисовка окна.

Комментариев нет:

Отправить комментарий