Проблема с обновлением текста в QLineEdit PyQt5
Я пишу небольшое приложение и мне необходимо запускать определенную функцию сразу после того как пользователь что-то ввел в поде ввода.
Я реализовал это так:
from PyQt5.QtWidgets import *
import sys
from time import sleep
def function():
sleep(2)
class Input(QLineEdit):
def __init__(self, main_window):
super().__init__(main_window)
self.main_window = main_window
def keyPressEvent(self, event):
super().keyPressEvent(event)
function()
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setupUi()
def setupUi(self):
self.input = Input(self)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
Проблема в том, что введенный пользователем в Input текст появляется не сразу, а только после выполнения функции, что не очень удобно.
Как исправить данную проблему?
Ответы (2 шт):
Не используйте time.sleep в основном потоке - это блокирует интерфейс.
void QTimer::singleShot(int msec, const QObject *receiver, const char *member)
Эта статическая функция вызывает слот через заданный интервал времени.
Эту функцию очень удобно использовать, потому что вам не нужно возиться с timerEvent или создавать локальный объект QTimer.
import sys
#from time import sleep
from PyQt5.QtWidgets import QLineEdit, QMainWindow, QApplication, \
QWidget, QGridLayout
from PyQt5.QtCore import QTimer
def function(letter):
print(f'Hello World -> {letter}')
# sleep(2)
class LineEdit(QLineEdit):
def __init__(self, main_window):
super().__init__(main_window)
self.main_window = main_window
def keyPressEvent(self, event):
super().keyPressEvent(event)
# function()
QTimer.singleShot(2000, lambda letter=event.text(): function(letter))
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.centralWidget = QWidget()
self.setCentralWidget(self.centralWidget)
self.layout = QGridLayout(self.centralWidget)
self.initUi()
def initUi(self):
self.lineEdit = LineEdit(self)
self.layout.addWidget(self.lineEdit)
# self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
Я бы сделал так чтобы не ждать всяких обновлений таймеров. И никаких задержек интерфейсов. 
import sys
from PyQt5.QtWidgets import QLineEdit, QMainWindow, QApplication, \
QWidget, QGridLayout
class LineEdit(QLineEdit):
def __init__(self, main_window):
super().__init__(main_window)
self.main_window = main_window
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.centralWidget = QWidget()
self.setCentralWidget(self.centralWidget)
self.layout = QGridLayout(self.centralWidget)
self.initUi()
self.lineEdit.textChanged.connect(self.press)
def press(self):
print(self.lineEdit.text())
def initUi(self):
self.lineEdit = LineEdit(self)
self.layout.addWidget(self.lineEdit)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
