Пользователь вводит букву в поле виджета 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 секунды управление возвращалось приложению, происходила очистка текстового поля виджета, перерисовка окна.
Комментариев нет:
Отправить комментарий