Я пытаюсь выполнить более одного действия в одной функции. В приведенном ниже коде вы увидите страницу окна с кнопкой и меткой. Я хочу видеть «СИНИЙ», а через 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")
Это сработало, и спасибо, что поделились другим ответом. Это помогло мне понять с python
void QTimer::singleShot(int msec, const QObject *receiver, const char *member)
This static function calls a slot after a given time interval.
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_())
большое спасибо, вы спасли мне жизнь
@hhilal Это ужасное решение, так как вы не должны использовать сон в python, например, попробуйте изменить размер окна за эти 2 секунды.
Я исправил свой пример после замечаний @eyllanesc
изменить
time.sleep(2) self.label.setText("RED")
наQTimer.singleShot(2*1000, lambda: self.label.setText("RED"))