2013-05-28 5 views
3

У меня проблема. Я пытаюсь установить текст в объекте lineEdit на pyqt4, а затем подождать несколько секунд и изменить текст того же lineEdit. Для этого я использую функцию time.sleep(), указанную на модуле времени python. Но моя проблема заключается в том, что вместо того, чтобы устанавливать текст, затем ждать и, наконец, переписывать текст в lineEdit, он просто ждет времени, когда он должен спать, и отображает только окончательный текст. Мой код выглядит следующим образом:Сон не работает на pyqt4

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

ответ

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

Вы не можете использовать time.sleep здесь потому, что замораживает GUI поток, так что GUI будет полностью заморожены в течение этого time.You может использовать модуль 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_()) 
+0

@eyllanesc: Не могли бы вы сказать мне, если что-то неправильно в этом коде. – PAR

Смежные вопросы