From cf4b749cd9ebab5e7d87a2b7a45c7e45753a58ca Mon Sep 17 00:00:00 2001 From: alessandro90 Date: Wed, 26 Sep 2018 14:36:11 +0200 Subject: [PATCH] QMediaPlayer version. Not working --- audio_player.py | 68 +++++++++ icons_imgs/volume.png | Bin 0 -> 34475 bytes main.py | 28 +++- main_window.ui | 330 +++++++++++++++++++++++++++++------------- 4 files changed, 326 insertions(+), 100 deletions(-) create mode 100644 audio_player.py create mode 100644 icons_imgs/volume.png diff --git a/audio_player.py b/audio_player.py new file mode 100644 index 0000000..118f603 --- /dev/null +++ b/audio_player.py @@ -0,0 +1,68 @@ +import os +import sys + +from PyQt5.QtCore import QUrl, QFileInfo +from PyQt5.QtMultimedia import QMediaContent, QMediaPlayer + + +class AudioPlayer(object): + def __init__(self, play, pause, stop, volume, audio_progress): + self.play = play + self.pause = pause + self.stop = stop + self.volume = volume + self.audio_progress = audio_progress + self.audio_file = None + self.player = QMediaPlayer() + self.player.setVolume(51) + self.player.durationChanged.connect(self.set_max_progress_bar) + self.player.positionChanged.connect(self.set_progress_bar) + self.play.clicked.connect(self.audio) + self.pause.clicked.connect(self.pause_audio) + self.stop.clicked.connect(self.stop_audio) + self.player.stateChanged.connect(self.reset_audio_widget) + self.volume.valueChanged.connect(self.set_volume) + + def set_volume(self): + self.player.setVolume(self.volume.value()) + + def reset_audio_widget(self): + if self.player.state() == QMediaPlayer.StoppedState: + self.audio_progress.setValue(0) + self.volume.setValue(51) + self.pause.setEnabled(False) + self.stop.setEnabled(False) + + def set_max_progress_bar(self): + print(self.player.duration()) + self.audio_progress.setMaximum(self.player.duration()) + + def set_progress_bar(self): + print(self.player.position()) + self.audio_progress.setValue(self.player.position()) + + def set_media_player(self): + self.player.setMedia(QMediaContent(self.audio_file)) + + def set_audio_player(self, fname): + self.reset_audio_widget() + self.play.setEnabled(False) + full_name = os.path.join('Data', 'Audio', fname + '.mp3') + if QFileInfo(full_name).exists(): + print('exists') + self.play.setEnabled(True) + self.audio_file = QUrl.fromLocalFile(full_name) + self.set_media_player() + else: + print('not exists') + + def audio(self): + self.player.play() + self.stop.setEnabled(True) + self.pause.setEnabled(True) + + def stop_audio(self): + self.player.stop() + + def pause_audio(self): + self.player.pause() diff --git a/icons_imgs/volume.png b/icons_imgs/volume.png new file mode 100644 index 0000000000000000000000000000000000000000..5cc56450d83bd20a803f1426f4f3adf53b128f30 GIT binary patch literal 34475 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 literal 0 HcmV?d00001 diff --git a/main.py b/main.py index cac0f1c..21bec38 100644 --- a/main.py +++ b/main.py @@ -6,7 +6,10 @@ from PyQt5.QtWidgets import (QMainWindow, QMessageBox,) from PyQt5.QtGui import QPixmap from PyQt5 import uic -from PyQt5.QtCore import QFileInfo +from PyQt5.QtCore import QFileInfo, QSize +import qtawesome as qta + +from audio_player import AudioPlayer qt_creator_file = "main_window.ui" @@ -20,7 +23,24 @@ class MyApp(QMainWindow, Ui_MainWindow): self.load_db() self.display_signals() self.search_bar.textChanged.connect(self.display_signals) - self.result_list.itemSelectionChanged.connect(self.display_spectrogram) + self.result_list.itemSelectionChanged.connect(self.display_specs) + self.play.setIcon(qta.icon('fa5.play-circle', + color = "#7a7a7a", + color_active = '#1d5eff')) + self.play.setIconSize(self.play.size()) + self.pause.setIcon(qta.icon('fa5.pause-circle', + color = "#7a7a7a", + color_active = '#1d5eff')) + self.pause.setIconSize(self.pause.size()) + self.stop.setIcon(qta.icon('fa5.stop-circle', + color = "#7a7a7a", + color_active = '#1d5eff')) + self.stop.setIconSize(self.stop.size()) + self.audio_widget = AudioPlayer(self.play, + self.pause, + self.stop, + self.volume, + self.audio_progress) def load_db(self): try: @@ -48,6 +68,10 @@ class MyApp(QMainWindow, Ui_MainWindow): if self.search_bar.text().lower() in signal.lower(): self.result_list.addItem(signal) + def display_specs(self): + self.display_spectrogram() + self.audio_widget.set_audio_player(self.result_list.currentItem().text()) + def display_spectrogram(self): spectrogram_name = self.result_list.currentItem().text() path_spectr = os.path.join("Data", "Spectra", spectrogram_name + ".jpg") diff --git a/main_window.ui b/main_window.ui index 5f2a926..acf16ac 100644 --- a/main_window.ui +++ b/main_window.ui @@ -10,6 +10,12 @@ 800 + + + 0 + 0 + + MainWindow @@ -23,18 +29,16 @@ QPushButton { } QProgressBar { - /*border: 2px solid grey;*/ - border-radius: 8px; - background-color: #7a7a7a + border: 2px #7a7a7a; + border-radius: 3px; + background-color: #7a7a7a; } QProgressBar::chunk { - background-color: #1d5eff; - width: 20px; - border-radius: 7px -} - - + /*background-color: #1d5eff;*/ + background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #1d5eff, stop:0.5 #4177ff, stop:1 #1d5eff); + border-radius: 3px; +} @@ -186,11 +190,7 @@ QTabWidget::tab-bar { /* Style the tab using the tab sub-control. Note that it reads QTabBar _not_ QTabWidget */ QTabBar::tab { - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #7a7a7a, stop: 1.0 #7a7a7a); - /*background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #E1E1E1, stop: 0.4 #DDDDDD, - stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3);*/ + background: #7a7a7a; border-top-left-radius: 8px; border-top-right-radius: 8px; min-width: 16ex; @@ -199,11 +199,7 @@ QTabBar::tab { } QTabBar::tab:selected { - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #999999, stop: 1.0 #999999); - /* background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #fafafa, stop: 0.4 #f4f4f4, - stop: 0.5 #e7e7e7, stop: 1.0 #fafafa);*/ + background: #999999; color: #1d5eff } @@ -240,89 +236,227 @@ QTabBar::tab:!selected { Main - + - 480 - 280 - 221 - 421 + 270 + 110 + 161 + 491 - - - - - true - - - - - - 50 - 120 - 371 - 381 - - - - - - 40 - 40 - 75 - 23 - - - - PushButton - - - - - - 140 - 40 - 75 - 23 - - - - PushButton - - - - - - 240 - 40 - 75 - 23 - - - - PushButton - - - - - - 110 - 90 - 118 - 23 - - - - - - - 15 - - - false - - + + + + + + 0 + 0 + + + + QPushButton { + /*background-color: #1d5eff;*/ + border: 1px solid gray; + border-color: #1d5eff; + border-radius: 20px; +} +/* +QPushButton:disabled { + background-color: #7a7a7a; +} +*/ + + + + + + false + + + + 0 + 0 + + + + + 16777215 + 10 + + + + + + + 75 + + + false + + + + + + + false + + + + 0 + 0 + + + + + 41 + 41 + + + + + + + false + + + + + + + false + + + + 0 + 0 + + + + + 41 + 41 + + + + + + + false + + + + + + + false + + + + 0 + 0 + + + + + 41 + 41 + + + + + + + + + + + + + + 0 + 0 + + + + + 20 + 20 + + + + + + + icons_imgs/volume.png + + + true + + + + + + + QSlider::groove:horizontal { + /*border: 1px solid #999999;*/ + height: 6px; /* the groove expands to the size of the slider by default. by giving it a height, it has a fixed size */ + background: #7a7a7a; + margin: 0 5px; + border-radius: 3px +} + +QSlider::handle:horizontal { + background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 gray, stop:0.5 white, stop:1.0 gray); + border: 1px solid #5c5c5c; + width: 15px; + margin: -5px -5px; /* handle is placed by default on the contents rect of the groove. Expand outside the groove */ + border-radius: 8px; +} + + + + 1 + + + 100 + + + 51 + + + Qt::Horizontal + + + + + + + + + + + + + 0 + 0 + + + + + 153 + 100 + + + + + + + true + + + +