Qtimer и закрытие приложения через 15 секунд прошло - PullRequest
0 голосов
/ 23 декабря 2019

Вечер. Я испытываю трудности с пониманием QTimer и его работы, а также с работой приведенного ниже кода. Как бы я ни ненавидел копирование / вставку, я просто не могу этого понять. Цель этого - запустить программу на 15 секунд, а затем полностью выйти из нее. Все остальное работает, но когда я пытаюсь интегрировать QTimer, чтобы посчитать, сколько секунд прошло, он ничего не делает или просто не работает независимо от вариантов, которые я пробую. Ниже приведен последний код:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QMovie
from PyQt5.QtCore import QTimer
import winsound
import time 
import sys

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(321, 249)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(0, 0, 320, 248))
        self.label.setFrameShape(QtWidgets.QFrame.Box)              
        self.label.setOpenExternalLinks(False)
        self.label.setTextInteractionFlags(QtCore.Qt.NoTextInteraction)
        self.label.setObjectName("label")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

        #Plays the movie in the Label
        movie = QMovie("giphy.gif")        
        self.label.setMovie(movie)
        movie.start()

        #Plays the sound with the movie
        winsound.PlaySound("magicwrd.wav", winsound.SND_ASYNC|winsound.SND_LOOP)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))


    #Borrowed and modified from here: https://stackoverflow.com/questions/46656634/pyqt5-qtimer-count-until-specific-seconds
    #Goal is to run the application for 15 seconds and then exit out completely. 
    def start_timer(self, slot, count=1, interval=1000):
        counter = 0
        def handler():
            nonlocal counter
            counter += 1
            slot(counter)
            if counter >= count:
                timer.stop()
                timer.deleteLater()
        timer = QtCore.QTimer()
        timer.timeout.connect(handler)
        timer.start(interval)

    def timer_func(self, count):
        if count >= 5:
            sys.exit(app.exec_())


if __name__ == "__main__":

    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    Ui_MainWindow.start_timer(Ui_MainWindow.timer_func, 5)
    app.exec_()

1 Ответ

1 голос
/ 23 декабря 2019

Если вы хотите завершить приложение за T секунд, тогда вы должны использовать QTimer::singleShot(), чтобы при его запуске QCoreApplication::quit() вызывалось:

QtCore.QTimer.singleShot(T * 1000, QtCore.QCoreApplication.quit)

В примере, который вы связываете,у него есть другая цель: печатать некоторую информацию каждые T секунд и после повторения K раз, приложение закрывается и поэтому использует сложную логику, которая вам не нужна.

Учитывая вышеизложенное и рекомендация PyQt5, решение:

import sys
import winsound

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(321, 249)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(0, 0, 320, 248))
        self.label.setFrameShape(QtWidgets.QFrame.Box)
        self.label.setOpenExternalLinks(False)
        self.label.setTextInteractionFlags(QtCore.Qt.NoTextInteraction)
        self.label.setObjectName("label")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        # Plays the movie in the Label
        movie = QtGui.QMovie("giphy.gif")
        self.label.setMovie(movie)
        movie.start()
        # Plays the sound with the movie
        winsound.PlaySound("magicwrd.wav", winsound.SND_ASYNC | winsound.SND_LOOP)


if __name__ == "__main__":

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    QtCore.QTimer.singleShot(15 * 1000, QtCore.QCoreApplication.quit)
    sys.exit(app.exec_())
...