Как увидеть более одного изменения в одной и той же функции при использовании сна в Python PySide2

Я пытаюсь выполнить более одного действия в одной функции. В приведенном ниже коде вы увидите страницу окна с кнопкой и меткой. Я хочу видеть «СИНИЙ», а через 2 секунды сна я хочу видеть «КРАСНЫЙ» текст на своей этикетке. Но когда я нажимаю кнопку, все функции работают как блок, и после двух секунд slepp текст метки меняется на «КРАСНЫЙ». Да, сначала он меняется на СИНИЙ, но я этого не вижу, потому что это слишком быстро. Как я могу это исправить?

class Form(QDialog):

def __init__(self, parent=None):
    super(Form, self).__init__(parent)
    #label is Hello now
    self.label=QLabel("Hello")
    self.button = QPushButton("Change it")
    layout = QVBoxLayout()
    layout.addWidget(self.label)
    layout.addWidget(self.button)
    self.setLayout(layout)
    self.button.clicked.connect(self.func)
def func(self):
    self.label.setText("BLUE")
    time.sleep(2)
    self.label.setText("RED")

person hhilal    schedule 08.04.2019    source источник
comment
изменить time.sleep(2) self.label.setText("RED") на QTimer.singleShot(2*1000, lambda: self.label.setText("RED"))   -  person eyllanesc    schedule 08.04.2019
comment
Это сработало, и спасибо, что поделились другим ответом. Это помогло мне понять с python   -  person hhilal    schedule 08.04.2019


Ответы (1)


void QTimer::singleShot(int msec, const QObject *receiver, const char *member)

Эта статическая функция вызывает слот через заданный интервал времени.

from PyQt5.QtCore    import *
from PyQt5.QtGui     import *
from PyQt5.QtWidgets import *

class Form(QDialog):

    def __init__(self, parent=None):
        super(Form, self).__init__(parent)
        
        #label is Hello now
        self.label  = QLabel("Hello")
        self.button = QPushButton("Change it")
        self.button.clicked.connect(self.func)
        
        layout = QVBoxLayout()
        layout.addWidget(self.label)
        layout.addWidget(self.button)
        self.setLayout(layout)
        
    def func(self):
        self.label.setText("BLUE")
#        QApplication.processEvents()      
#        QThread.msleep(2000)              
#        self.label.setText("RED")
        QTimer.singleShot(2000, lambda : self.label.setText("RED"))       # <----
    
if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    w = Form()
    w.show()
    sys.exit(app.exec_())

введите здесь описание изображения

person S. Nick    schedule 08.04.2019
comment
большое спасибо, вы спасли мне жизнь - person hhilal; 08.04.2019
comment
@hhilal Это ужасное решение, так как вы не должны использовать сон в python, например, попробуйте изменить размер окна за эти 2 секунды. - person eyllanesc; 08.04.2019
comment
Я исправил свой пример после замечаний @eyllanesc - person S. Nick; 08.04.2019