Измените индекс Stacked Widget автоматически через 3 секунды в PyQt5

1

Я пытаюсь отобразить первую страницу сложного виджета (приветственная страница) и через 3 секунды автоматически заменить его на вторую страницу (страницу меню).

Я пробовал этот подход, но он не работает.

..........

self.stackedWidget.setCurrentIndex(0)
time.sleep(3) 
self.stackedWidget.setCurrentIndex(1) 
QtCore.QMetaObject.connectSlotsByName(smartUpdaterUI)

..............
Теги:
pyqt5

2 ответа

0
Лучший ответ

Qt использует цикл событий GUI для обработки событий и обновления пользовательского интерфейса. Любые обновления графического интерфейса не будут видны до тех пор, пока управление не будет передано циклу событий, и это обновление не будет получено и обработано.

Код, который вы пишете на Python, происходит в том же потоке, что и GUI. Поэтому, пока ваш код запущен, цикл событий не выполняется, и изменения не обрабатываются.

Замечание: поэтому ваше приложение может "зависать", если вы попытаетесь сделать что-то долгое, как доступ к API, без использования отдельного потока.

В вашем коде вы устанавливаете текущий индекс time.sleep() 0, а затем используете Python time.sleep() для ожидания до обновления до индекса 1.

self.stackedWidget.setCurrentIndex(0)
time.sleep(3) # no event loop running here
self.stackedWidget.setCurrentIndex(1) 

Пока выполняется time.sleep(3), выполнение выполняется в этот момент. Это означает, что управление не возвращается в цикл событий Qt, и первое изменение не обрабатывается. По завершении таймаута устанавливается второй индекс, и только тогда ваша функция возвращает управление обратно в Qt.

Цикл событий теперь применяет оба изменения, но сразу один за другим. Итак, все, что вы видите, - это индекс, установленный в 1, без предварительного показа 0 и без какой-либо задержки.

Чтобы этого избежать, вам нужно вернуть управление обратно в цикл событий после установки начального индекса. Самый простой способ сделать это - просто установить его, а затем запустить последующее обновление с помощью асинхронного QTimer.

self.stackedWidget.setCurrentIndex(0)
QTimer.singleShot(3000, lambda: self.stackedWidget.setCurrentIndex(1))

lambda: используется как анонимная функция, поэтому мы можем передать 1 в setCurrentIndex, задерживая выполнение до тех пор, пока таймер не будет запущен. Если вы только прыгаете на одну страницу, вы можете сделать это вместо этого:

def go_to_page_1(self):
    self.stackedWidget.setCurrentIndex(1)

self.stackedWidget.setCurrentIndex(0)
QTimer.singleShot(3000, go_to_page_1)
  • 0
    спасибо, очень полезно :)
0

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

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

Попытайся:

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

class stackedExample(QWidget):
    def __init__(self):
        super(stackedExample, self).__init__()

        self.leftlist = QListWidget()
        self.leftlist.insertItem (0, 'Contact'     )
        self.leftlist.insertItem (1, 'Personal'    )
        self.leftlist.insertItem (2, 'Educational' )

        self.stack1 = QWidget()
        self.stack2 = QWidget()
        self.stack3 = QWidget()

        self.stack1UI()
        self.stack2UI()
        self.stack3UI()

        self.stackWidget = QStackedWidget(self)
        self.stackWidget.addWidget(self.stack1)
        self.stackWidget.addWidget(self.stack2)
        self.stackWidget.addWidget(self.stack3)

        hbox = QHBoxLayout(self)
        hbox.addWidget(self.leftlist)
        hbox.addWidget(self.stackWidget)

        self.setLayout(hbox)
        self.leftlist.currentRowChanged.connect(self.display)
        self.setGeometry(300, 50, 10, 10)
        self.setWindowTitle('StackedWidget demo')

        self.stackWidget.setCurrentIndex(0)
        QTimer.singleShot(3000, lambda: self.display(1))
        QTimer.singleShot(6000, lambda: self.display(2))
        QTimer.singleShot(9000, lambda: self.display(0))

        self.show()

    def stack1UI(self):
        layout = QFormLayout()
        layout.addRow("Name",    QLineEdit())
        layout.addRow("Address", QLineEdit())
        #self.setTabText(0,"Contact Details")
        self.stack1.setLayout(layout)

    def stack2UI(self):
        layout = QFormLayout()
        sex    = QHBoxLayout()
        sex.addWidget(QRadioButton("Male"))
        sex.addWidget(QRadioButton("Female"))
        layout.addRow(QLabel("Sex"),sex)
        layout.addRow("Date of Birth",QLineEdit())
        self.stack2.setLayout(layout)

    def stack3UI(self):
        layout = QHBoxLayout()
        layout.addWidget(QLabel("subjects"))
        layout.addWidget(QCheckBox("Physics"))
        layout.addWidget(QCheckBox("Maths"))
        self.stack3.setLayout(layout)

    def display(self, i):
        self.stackWidget.setCurrentIndex(i)

def main():
    app = QApplication(sys.argv)
    ex  = stackedExample()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()        
  • 0
    Спасибо большое !!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню