Δημοσιεύτηκε: 09 Ιαν 2024, 15:11
από malos
Πρόσθεσα την ιδιότητα να έχει για φόντο ένα gif animation (έτσι για να θυμίζει τα εφφέ που έχουν οι media players). Kαι όταν πατάω το play και γίνεται αναπαραγωγή το gif αλλάζει και αντικαθίσταται από κάποιο άλλο (ένδειξη για μένα ότι γίνεται αναπαραγωγή)

Εικόνα

και

Εικόνα

Ο κώδικας
Κώδικας: Επιλογή όλων
from PyQt5 import QtWidgets, QtMultimedia, QtXml, QtGui, QtCore

class RadioWidget(QtWidgets.QWidget):
def __init__(self, parent=None):
super(RadioWidget, self).__init__(parent)
self.is_playing = False
self.setFixedSize(227, 90)
self.setStyleSheet("background-color: transparent;")
self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
self.move(1312, 258)

self.view = QtWidgets.QGraphicsView(self)
self.view.setGeometry(0, 0, 227, 90)
self.view.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.view.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.scene = QtWidgets.QGraphicsScene(self)
self.view.setScene(self.scene)

self.movie_quantum = QtGui.QMovie("gifs/quantum.gif")
self.movie_quantum.frameChanged.connect(self.update_background)
self.movie_item = self.scene.addPixmap(QtGui.QPixmap.fromImage(self.movie_quantum.currentImage()))
self.movie_item.setTransformationMode(QtCore.Qt.SmoothTransformation)
self.movie_quantum.start()

self.movie_water = QtGui.QMovie("gifs/water.gif")
self.movie_water.frameChanged.connect(self.update_water_background)
self.movie_water_item = self.scene.addPixmap(QtGui.QPixmap.fromImage(self.movie_water.currentImage()))
self.movie_water_item.setTransformationMode(QtCore.Qt.SmoothTransformation)
self.movie_water_item.setOpacity(0)

self.play_button = QtWidgets.QPushButton(self)
self.play_button.setGeometry(5, 2, 70, 70)
self.play_button.setIconSize(QtCore.QSize(64, 64))
self.play_button.setChecked(False)
self.play_button.setStyleSheet(
"""
QPushButton {
border-image: url('play1.png');
}
QPushButton:hover {
border-image: url('play12.png');
}
"""
)
self.play_button.setToolTip("Κάνε κλικ για αναπαραγωγή")

self.stop_button = QtWidgets.QPushButton(self)
self.stop_button.setGeometry(5, 2, 70, 70)
self.stop_button.setIconSize(QtCore.QSize(64, 64))
self.stop_button.setChecked(False)
self.stop_button.setStyleSheet(
"""
QPushButton {
border-image: url('stop1.png');
}
QPushButton:hover {
border-image: url('stop12.png');
}
"""
)
self.stop_button.setToolTip("Κάνε κλικ για παύση")
self.stop_button.hide()

self.station_combo = QtWidgets.QComboBox(self)
self.station_combo.setGeometry(83, 20, 128, 40)
self.station_combo.setIconSize(QtCore.QSize(128, 40))
self.station_combo.setStyleSheet("QComboBox::down-arrow {width: 0px; height: 0px;}")
self.station_combo.setStyleSheet(
"""
QComboBox {
background-color: #a39c9c;
border: 2px solid #d9d9d9;
border-radius: 10px;
}
QComboBox:hover {
background-color: #a4a4a4;
border: 4px groove #000000;
}
"""
)
self.station_combo.setToolTip("Επιλογή σταθμού αναπαραγωγής")

self.model = QtGui.QStandardItemModel(self)
self.station_combo.setModel(self.model)

self.media_player = QtMultimedia.QMediaPlayer(self)
self.read_stations()
self.connect_signals()
self.set_up_ui()

def read_stations(self):
dom = QtXml.QDomDocument()
file = QtCore.QFile("stations.xml")
file.open(QtCore.QIODevice.ReadOnly)
dom.setContent(file)
file.close()
root = dom.documentElement()
items = root.elementsByTagName("item")

self.station_combo.clear()

for i in range(items.count()):
item = items.item(i).toElement()
label = item.attribute("label")
id = item.attribute("id")
url = QtCore.QUrl(id)

self.station_combo.addItem(label, url)

def connect_signals(self):
self.play_button.clicked.connect(self.play_or_stop)
self.stop_button.clicked.connect(self.play_or_stop)
self.station_combo.currentIndexChanged.connect(self.change_station)
self.media_player.stateChanged.connect(self.update_background_color)

def set_up_ui(self):
self.play_button.setIcon(QtGui.QIcon("play1.png"))

@QtCore.pyqtSlot(int)
def change_station(self, index):
station_url = self.station_combo.currentData()
print(f"Selected station: {self.station_combo.currentText()}, URL: {station_url}")

media_content = QtMultimedia.QMediaContent(station_url)
self.media_player.setMedia(media_content)

if self.is_playing:
self.media_player.play()

@QtCore.pyqtSlot()
def play_or_stop(self):
self.is_playing = not self.is_playing

if self.is_playing:
self.play_button.setIcon(QtGui.QIcon("stop1.png"))
self.stop_button.show()
self.play_button.hide()
url = self.station_combo.currentData()
media_content = QtMultimedia.QMediaContent(url)
self.media_player.setMedia(media_content)
self.media_player.play()

self.movie_water.start()
self.movie_water_item.setOpacity(1)
else:
self.stop_button.hide()
self.play_button.setIcon(QtGui.QIcon("play1.png"))
self.play_button.show()
self.media_player.stop()

self.movie_quantum.start()
self.movie_water_item.setOpacity(0)

self.update_background_color()

def update_background_color(self):
self.setStyleSheet(f"background-color: transparent;")

def enterEvent(self, event):
self.setStyleSheet("color: white; background-color: #000301;")

def leaveEvent(self, event):
self.setStyleSheet(f"background-color: transparent;")

def paintEvent(self, event):
pass

@QtCore.pyqtSlot()
def update_background(self):
self.movie_item.setPixmap(QtGui.QPixmap.fromImage(self.movie_quantum.currentImage()))
self.repaint()

@QtCore.pyqtSlot()
def update_water_background(self):
self.movie_water_item.setPixmap(QtGui.QPixmap.fromImage(self.movie_water.currentImage()))
self.repaint()


if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
radio_widget = RadioWidget()
radio_widget.show()
sys.exit(app.exec_())