Вопрос по python, python-3.x, pyqt, qt, sleep – Сон не работает на pyqt4

3

У меня есть эта проблема. Я пытаюсь установить текст в объекте 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_())

Ваш Ответ

2   ответа
-1

потому что это замораживает поток 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_())
@eyllanesc: Не могли бы вы сказать мне, если что-то не так в этом коде. PAR
6

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_())

Похожие вопросы