Вопрос по python, python-3.x, pyqt, qt, sleep – Сон не работает на pyqt4
У меня есть эта проблема. Я пытаюсь установить текст в объекте lineEdit на pyqt4, затем подожду несколько секунд и меняю текст того же lineEdit. Для этого я используюtime.sleep()
функция, указанная в модуле времени Python. Но моя проблема в том, что вместо установки текста, а затем ожидания и, наконец, переписывания текста в lineEdit, он просто ждет времени, которое он должен спать, и показывает только окончательный текст. Мой код выглядит следующим образом:
from PyQt4 import QtGui
from gui import *
class Ventana(QtGui.QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setupUi(self)
self.button.clicked.connect(self.testSleep)
def testSleep(self):
import time
self.lineEdit.setText('Start')
time.sleep(2)
self.lineEdit.setText('Stop')
def mainLoop(self, app ):
sys.exit( app.exec_())
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = Ventana()
window.show()
sys.exit(app.exec_())
потому что это замораживает поток GUI, поэтому GUI будет полностью заморожен в течение этого времени. Вы можете использовать модуль QtTest вместо time.sleep ().
from PyQt4 import QtTest
QtTest.QTest.qWait(msecs)
Итак, ваш код должен выглядеть так:
from PyQt4 import QtGui,QtTest
from gui import *
class Ventana(QtGui.QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setupUi(self)
self.button.clicked.connect(self.testSleep)
def testSleep(self):
import time
self.lineEdit.setText('Start')
QtTest.QTest.qWait(2000)
self.lineEdit.setText('Stop')
def mainLoop(self, app ):
sys.exit( app.exec_())
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = Ventana()
window.show()
sys.exit(app.exec_())
time.sleep
здесь, потому что это останавливает поток GUI, поэтому GUI будет полностью заморожен в течение этого времени.
Вы, вероятно, должны использоватьQTimer
и использовать этоtimeout
сигнал для планирования сигнала для отложенной доставки, или этоsingleShot
метод.
Например (адаптировал ваш код, чтобы он работал без зависимостей):
from PyQt4 import QtGui, QtCore
class Ventana(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setLayout(QtGui.QVBoxLayout())
self.lineEdit = QtGui.QLineEdit(self)
self.button = QtGui.QPushButton('clickme', self)
self.layout().addWidget(self.lineEdit)
self.layout().addWidget(self.button)
self.button.clicked.connect(self.testSleep)
def testSleep(self):
self.lineEdit.setText('Start')
QtCore.QTimer.singleShot(2000, lambda: self.lineEdit.setText('End'))
def mainLoop(self, app ):
sys.exit( app.exec_())
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = Ventana()
window.show()
sys.exit(app.exec_())