我有这个问题。我试图在pyqt4上的lineedit对象上设置文本,然后等待几秒钟并更改同一lineedit的文本。为此,我使用了python时间模块上的time.sleep()函数。但我的问题是,它不是设置文本,然后等待并最终在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_())

最佳答案

您不能在这里使用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_())

09-25 20:55