Python >> Tutoriel Python >  >> Python GUI >> PyQt GUI

Créer une minuterie à l'aide de PyQt5 et jouer le son de l'alarme en Python

Dans cet article, je vais vous apprendre une application en Python qui peut être utilisée comme "TIMER" pour régler des alarmes pendant moins d'une heure environ. Et en réalisant ce petit projet, vous créez non seulement votre "Timer" personnel indépendant de la plate-forme, mais vous pouvez également apprendre à jouer des sons à l'aide de Python. J'ai également utilisé le concept de threading dans PyQt5, qui est une "chose à apprendre" pour les développeurs Python intermédiaires et aide également à exécuter n'importe laquelle de vos applications de manière transparente !

La version Python et les modules que j'ai utilisés :

‘3.7.4 (tags/v3.7.4:e09359112e, 8 juillet 2019, 19:29:22) [MSC v.1916 32 bits (Intel)]’

Aperçu de la logique du code

J'essaie d'écrire des codes courts et faciles à comprendre. Tout d'abord, comprenons comment penser avant de créer ce "Timer"

  1. Vous devez donner une durée d'entrée, pour laquelle votre minuteur comptera.
  2. Vous devez ajouter des secondes à 0 h, 0 min et 0 seconde pour atteindre le temps que vous avez défini à l'étape précédente. Par exemple (5 mins )
  3. Comme je l'ai promis, je vais démontrer la lecture d'un fichier son en Python ! Je vais sûrement remplir cela. À la fin du compte à rebours, déclenchez la lecture du son (j'utiliserai pydub pour cette action).
  4. Et aussi, vous devez vous rappeler que, parfois, les réveils qui ne s'arrêtent pas deviennent irritants, mais je ne vous laisserai pas vous énerver sur le "Minuteur". Je vais également implémenter du code pour arrêter le trrrrring ! résonne sur ta volonté.

Passons à la partie conception

Comme toujours, je préférerai utiliser Qt Designer à des fins de conception. Et le hic de l'application sera :

  1. Une belle apparence colorée
  2. Excellente gestion de la mise en page
  3. Fonctionnement fluide sous Windows et Linux

Et le Design ressemblera à ceci :


It has 5 Qlabel widgets.
4 Horizontal spacers and 2 vertical spacers
1 spin box
1 push button

Maintenant, pour ressembler exactement à mon application, vous devez apporter quelques modifications. Vous devez sélectionner le widget spinbox, puis modifier buttonSymbols à NoButtons depuis l'éditeur de propriétés dans le concepteur Qt. Sélectionnez "set timer ” et “From Now ” étiquettes une par une et changez leur alignement vertical en AlignTop et sélectionnez le libellé placé au milieu de l'écran puis éditez la feuille de style depuis l'éditeur de propriétés. Ajoutez ensuite un dégradé, sélectionnez votre dégradé et appuyez sur "ok" pour confirmer.

Sélectionnez maintenant la zone de sélection numérique et l'étiquette des minutes et cliquez avec le bouton droit pour définir la disposition et la disposition verticalement. Ensuite, sélectionnez l'étiquette Définir la minuterie, le widget de disposition verticale et l'étiquette "À partir de maintenant", puis cliquez avec le bouton droit pour définir la disposition horizontalement.
Sélectionnez maintenant la disposition horizontale la plus élevée, l'étiquette du milieu (celle qui est de couleur rouge), " "Temps passé", et le bouton poussoir et encore un clic droit jusqu'à set layout vertically .

Désormais, la mise en page est l'une des parties les plus importantes, car lorsque vous redimensionnez votre fenêtre, les widgets internes sont automatiquement alignés.

enregistrez sous timer.ui puis convertissez le fichier .ui du fichier XML de Qt Designer en code Python en utilisant
pyuic5 timer.ui -o timer.py

Créez maintenant un autre fichier Python dans le même répertoire et enregistrez-le sous call_timer.py et modifiez ce fichier pour implémenter votre logique de minuterie !

J'ai écrit ce code qui fonctionne bien, vous pouvez simplement vous y rapporter :

import sys
from my_timer import *
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5 import QtCore
from pydub import AudioSegment
from pydub.playback import play
from PyQt5.QtCore import pyqtSignal, QThread


class CloneThread(QThread):
    signal = pyqtSignal('PyQt_PyObject')

    def __init__(self):
        QThread.__init__(self)

    def run(self):
        music = AudioSegment.from_mp3(
            "C:\\Users\\tuhin Mitra\\Desktop\\All Python Resources\\gui_project\\alarm.mp3")  # path to the audio file that will play after time is over
        play(music)
        self.signal.emit('')  # signal for main thread to understand this thread working has finished!


class Mytimer(QMainWindow):
    def __init__(self):
        super().__init__()
        self.thread1 = CloneThread()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.timer = QtCore.QTimer()
        self.curr_time = QtCore.QTime(0, 0, 0) # initialize to 0
        self.Reach_timer = self.curr_time
        self.thread1.signal.connect(self.thread1.terminate)
        self.time = QtCore.QTime(self.curr_time)
        self.timer.timeout.connect(self.TimerEvent) 
        self.ui.pushButton.clicked.connect(self.terminal)  # action for push button click

    def TimerEvent(self):
        self.time = self.time.addSecs(1)  # add seconds to running time
        if self.time.toString() == self.Reach_timer.toString():  # check if destination is reached
            print('Time Reached')
            self.timer.stop()
            self.thread1.start()
            self.thread1.start()
        self.ui.label.setText(self.time.toString("hh:mm:ss"))  # to display the count

    def terminal(self):
        button_text = self.ui.pushButton.text()
        if button_text == 'START':
            # self.ui.pushButton.setDisabled(True)
            minutes = int(self.ui.spinBox.text())  # get text from spin box
            self.set_timer = minutes * 60  # converted into seconds
            self.Reach_timer = self.curr_time.addSecs(minutes * 60)  # set the destination
            self.ui.pushButton.setText('STOP')  # set button text for stop
            self.timer.start(1000)  # start timer, after every 1000 ms it will call TimerEvent to increase the counting
        else:
            self.thread1.terminate()  # this will terminate the playing of the audio file
            self.curr_time = QtCore.QTime(0, 0, 0)
            self.time = self.curr_time  # re-initialize to 0
            self.ui.pushButton.setText('START')  # show push button text as "start"
            self.timer.stop()  # when stop is pressed, stop the timer


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Mytimer()
    w.show()
    sys.exit(app.exec_())

Et j'ai importé le fichier my_timer, c'est simplement le code python généré à partir du fichier UI.
Vous pouvez voir my_timer.py :my_timer.py (décompressez simplement ce fichier)

et le fichier call_my_timer.py (Décompressez ce fichier)

Et vous devez placer le fichier alarm.mp3 dans le même répertoire pour jouer le son de l'alarme à la fin du compte à rebours !


Post précédent