簡體   English   中英

睡眠在 pyqt4 上不起作用

[英]Sleep is not working on pyqt4

我有這個問題。 我正在嘗試在 pyqt4 上的 lineEdit 對象上設置文本,然后等待幾秒鍾並更改同一 lineEdit 的文本。 為此,我使用了 python Time 模塊上給出的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_())

另外,看看 QThread sleep() 函數,它使當前線程進入睡眠狀態並允許其他線程運行。 https://doc.qt.io/qt-5/qthread.html#sleep

這里不能使用time.sleep,因為這會凍結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_())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM