Chargement en cours config/webradiopi.cfg +1 −1 Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff 54 No newline at end of file 60 No newline at end of file icons/pagef.png→icons/next_page.png (9,14 ko) Fichier déplacé. Voir le fichier icons/pageb.png→icons/previous_page.png (9,01 ko) Fichier déplacé. Voir le fichier main.py +6 −6 Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff Chargement en cours @@ -3,7 +3,7 @@ # Auteur : Daniel SAZERAT (thorfin89@free.fr) # import ---------------------------------- from vlc import Instance import vlc ''' installer le paquet python-vlc : $ sudo pip3 install python-vlc installer aussi l'application VLC ''' Chargement en cours @@ -15,7 +15,7 @@ from pupitre import Pupitre # gestion de l'interface sous Tkinter class Radio(Pupitre): def __init__(self): super().__init__() # constructeur de la classe parente self.instance = Instance() self.instance = vlc.Instance() self.player = self.instance.media_player_new() def radio_flux(self, flux): Chargement en cours Chargement en cours @@ -56,13 +56,13 @@ class Radio(Pupitre): config_file.close() self.player.audio_set_volume(volume_init) def radio_forward(self): # passe à la radio suivante def next_radio(self): # passe à la radio suivante self.num_radio_selected += 1 # changement de page automatique if self.num_radio_selected % 20 == 0 and self.num_radio_selected < self.nb_radios: # si le numéro est un multiple de 20 et qu'on n'est pas au bout de la liste self.page_forward() self.next_page() if self.num_radio_selected == self.nb_radios: # si on arrive à la fin de la liste self.num_radio_selected = 0 Chargement en cours @@ -71,14 +71,14 @@ class Radio(Pupitre): self.radio_selected(self.num_radio_selected) def radio_back(self): # passe à la radio précédente def previous_radio(self): # passe à la radio précédente self.num_radio_selected -= 1 print(self.num_radio_selected) # changement de page automatique if ( self.num_radio_selected + 1) % 20 == 0 and self.num_radio_selected != -1: # si le numéro est un multiple de 20 self.page_back() self.previous_page() if self.num_radio_selected == -1: self.num_radio_selected = self.nb_radios - 1 Chargement en cours pupitre.py +61 −58 Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff Chargement en cours @@ -5,9 +5,9 @@ # import ---------------------------------- import tkinter as tk from tkinter import ttk, Scale, HORIZONTAL from PIL import Image, ImageTk import csv from vlc import Meta import vlc from PIL import Image, ImageTk mute = False # le son n'est pas coupé au démarrage radio_on = False # mémorise le fait d'écouter une radio ou pas Chargement en cours Chargement en cours @@ -39,30 +39,10 @@ class Pupitre: self.root.attributes('-fullscreen', False) # < à basculer sur False pour les tests sur PC self.root.config(bg=bg_color) # logos des boutons self.icon_back = tk.PhotoImage(file="./icons/back.png") self.icon_play = tk.PhotoImage(file="./icons/play.png") self.icon_pause = tk.PhotoImage(file="./icons/pause.png") self.icon_stop = tk.PhotoImage(file="./icons/stop.png") self.icon_forward = tk.PhotoImage(file="./icons/forward.png") self.icon_sound = tk.PhotoImage(file="./icons/sound_up.png") self.icon_mute = tk.PhotoImage(file="./icons/mute.png") self.icon_pageb = tk.PhotoImage(file="./icons/pageb.png") self.icon_pagef = tk.PhotoImage(file="./icons/pagef.png") self.zones() # affichage des 3 zones self.mosaique() # affichage d'une mosaïque de logos des radios self.boutons() # affichage des boutons self.menu_droite() # affichage de la radio choisie self.radio_name() # affichage de l'info sur l'application self.num_radio_selected = 0 def zones(self): # ==== ZONES DE WIDGETS ========================================== # fenêtre contenant la mosaïque de logos des radios > dim 500x400 self.zone_mosaique = tk.Frame(self.root, bg="lightgray") self.zone_mosaique.place(width="500", height="400", x=10, y=10) self.logos = tk.Frame(self.root, bg="lightgray") self.logos.place(width="500", height="400", x=10, y=10) # fenêtre d'affichage de la radio en cours de lecture et des boutons de commande > dim 300x400 self.menu = tk.Frame(self.root, bg=bg_color) Chargement en cours @@ -72,19 +52,41 @@ class Pupitre: self.bandeau = tk.Frame(self.root, bg=bg_color) self.bandeau.place(width="510", height="60", x=0, y=420) def boutons(self): # ==== FONCTIONS ================================================= self.mosaique() # affichage d'une mosaïque de logos des radios self.right_panel() # affichage de la radio choisie self.radio_name() # affichage de l'info sur l'application self.num_radio_selected = 0 # ==== BOUTONS =================================================== # Logos des boutons self.icon_play = tk.PhotoImage(file="./icons/play.png") self.icon_pause = tk.PhotoImage(file="./icons/pause.png") self.icon_stop = tk.PhotoImage(file="./icons/stop.png") self.icon_previous_radio = tk.PhotoImage(file="./icons/back.png") self.icon_next_radio = tk.PhotoImage(file="./icons/forward.png") self.icon_previous_page = tk.PhotoImage(file="icons/previous_page.png") self.icon_next_page = tk.PhotoImage(file="icons/next_page.png") self.icon_sound = tk.PhotoImage(file="./icons/sound_up.png") self.icon_mute = tk.PhotoImage(file="./icons/mute.png") # définition d'un style commun à tous les boutons style = ttk.Style() style.configure("BW.TLabel", foreground="black", background=bg_color) # bouton page arrière btn_pageb = ttk.Button(self.bandeau, image=self.icon_pageb, command=self.page_back, style="BW.TLabel") btn_pageb.place(width=40, height=32, x=40, y=10) # bouton page précédente btn_previous_page = ttk.Button(self.bandeau, image=self.icon_previous_page, command=self.previous_page, style="BW.TLabel") btn_previous_page.place(width=40, height=32, x=40, y=10) # boutons radio arrière btn_back = ttk.Button(self.bandeau, image=self.icon_back, command=self.radio_back, style="BW.TLabel") btn_back.place(width=48, height=32, x=105, y=10) # boutons radio précédente btn_previous_radio = ttk.Button(self.bandeau, image=self.icon_previous_radio, command=self.previous_radio, style="BW.TLabel") btn_previous_radio.place(width=48, height=32, x=105, y=10) # bouton pause btn_play = ttk.Button(self.bandeau, image=self.icon_pause, command=self.radio_pause, style="BW.TLabel") Chargement en cours @@ -98,21 +100,26 @@ class Pupitre: btn_stop = ttk.Button(self.bandeau, image=self.icon_stop, command=self.radio_stop, style="BW.TLabel") btn_stop.place(width=32, height=32, x=304, y=10) # bouton radio avant btn_forward = ttk.Button(self.bandeau, image=self.icon_forward, command=self.radio_forward, style="BW.TLabel") btn_forward.place(width=48, height=32, x=367, y=10) # bouton radio suivante btn_next_radio = ttk.Button(self.bandeau, image=self.icon_next_radio, command=self.next_radio, style="BW.TLabel") btn_next_radio.place(width=48, height=32, x=367, y=10) # bouton page suivante btn_next_page = ttk.Button(self.bandeau, image=self.icon_next_page, command=self.next_page, style="BW.TLabel") btn_next_page.place(width=40, height=32, x=440, y=10) # bouton page avant btn_pagef = ttk.Button(self.bandeau, image=self.icon_pagef, command=self.page_forward, style="BW.TLabel") btn_pagef.place(width=40, height=32, x=440, y=10) self.btn_mute = ttk.Button(self.menu, image=self.icon_sound, text="Mute", command=self.switch_sound, style="BW.TLabel") self.btn_mute.place(width=30, height=32, x=233, y=430) def menu_droite(self): def right_panel(self): # affiche du logo de la radio sélectionnée >>> placer ici l'icone de la radio en 200x200 # affiche du logo de la radio sélectionnée self.lbl_radio_logo = ttk.Label(self.menu, background=bg_color_light) self.lbl_radio_logo.place(width=225, height=225, x=33, y=33) # affiche le noù de la radio # affiche le nom de la radio self.lbl_radio_name = tk.Label(self.menu) self.lbl_radio_name.place(width=270, height=30, x=10, y=270) self.lbl_radio_name.config(font=('Helvetica', 16), bg=bg_color, fg="white") Chargement en cours @@ -123,11 +130,10 @@ class Pupitre: self.lbl_radio_info.config(font=('Helvetica', 10), anchor="n", bg=bg_color, fg="white", wraplength=240) # potentiomètre de volume # - on charge la configuration du volume sauvegardée lecture = open("config/webradiopi.cfg", "r") lecture = open("config/webradiopi.cfg", "r") # on charge la configuration du volume sauvegardée volume_init = lecture.read() lecture.close() # - affichage du potentiomètre de volume vol_potar = Scale(self.menu, from_=0, to=100, tickinterval=20, orient=HORIZONTAL, length=190, label="Volume", command=self.volume, bg=bg_color, fg="white", highlightthickness=0) Chargement en cours @@ -135,9 +141,6 @@ class Pupitre: vol_potar.place(x=30, y=400) # boutons de coupure et rétablissement du son self.btn_mute = ttk.Button(self.menu, image=self.icon_sound, text="Mute", command=self.switch_sound, style="BW.TLabel") self.btn_mute.place(width=30, height=32, x=233, y=430) def mosaique(self): # récupération de la liste des radios (+infos) et affichage de la mosaïque de logos Chargement en cours Chargement en cours @@ -165,7 +168,7 @@ class Pupitre: self.logo[num_case] = ImageTk.PhotoImage(img) # création du bouton avec le logo de la radio btn_logo = tk.Button(self.zone_mosaique, image=self.logo[num_case]) btn_logo = tk.Button(self.logos, image=self.logo[num_case]) # utilisation d'une fonction 'lambda' indexée sur la position du logo btn_logo.config(command=lambda flux=radios_list[num_radio]['Url'], Chargement en cours Chargement en cours @@ -212,14 +215,14 @@ class Pupitre: self.btn_mute.config(image=self.icon_sound) # affichage "logo sound on" mute = False def page_back(self): # commande de page en arrière def previous_page(self): # commande de page en arrière self.current_page -= 1 if self.current_page < 0: # Quand tente de remonter avant la première page (page 0) self.current_page = self.nb_pages # on boucle sur la dernière self.mosaique() def page_forward(self): # commande page en avant def next_page(self): # commande page en avant self.current_page += 1 if self.current_page > self.nb_pages: # quand on avance au-delà de la dernière page self.current_page = 0 # on revient à la première Chargement en cours @@ -234,7 +237,7 @@ class Pupitre: def radio_info(self): if self.radio_on: # si on a une radio en cours d'écoute flux_info = self.media.get_meta(Meta.NowPlaying) # on récupère l'info sur le titre actuel flux_info = self.media.get_meta(vlc.Meta.NowPlaying) # on récupère l'info sur le titre actuel if flux_info: # si on a bien une information sur le titre longueur = len(flux_info) Chargement en cours Chargement en cours
config/webradiopi.cfg +1 −1 Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff 54 No newline at end of file 60 No newline at end of file
main.py +6 −6 Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff Chargement en cours @@ -3,7 +3,7 @@ # Auteur : Daniel SAZERAT (thorfin89@free.fr) # import ---------------------------------- from vlc import Instance import vlc ''' installer le paquet python-vlc : $ sudo pip3 install python-vlc installer aussi l'application VLC ''' Chargement en cours @@ -15,7 +15,7 @@ from pupitre import Pupitre # gestion de l'interface sous Tkinter class Radio(Pupitre): def __init__(self): super().__init__() # constructeur de la classe parente self.instance = Instance() self.instance = vlc.Instance() self.player = self.instance.media_player_new() def radio_flux(self, flux): Chargement en cours Chargement en cours @@ -56,13 +56,13 @@ class Radio(Pupitre): config_file.close() self.player.audio_set_volume(volume_init) def radio_forward(self): # passe à la radio suivante def next_radio(self): # passe à la radio suivante self.num_radio_selected += 1 # changement de page automatique if self.num_radio_selected % 20 == 0 and self.num_radio_selected < self.nb_radios: # si le numéro est un multiple de 20 et qu'on n'est pas au bout de la liste self.page_forward() self.next_page() if self.num_radio_selected == self.nb_radios: # si on arrive à la fin de la liste self.num_radio_selected = 0 Chargement en cours @@ -71,14 +71,14 @@ class Radio(Pupitre): self.radio_selected(self.num_radio_selected) def radio_back(self): # passe à la radio précédente def previous_radio(self): # passe à la radio précédente self.num_radio_selected -= 1 print(self.num_radio_selected) # changement de page automatique if ( self.num_radio_selected + 1) % 20 == 0 and self.num_radio_selected != -1: # si le numéro est un multiple de 20 self.page_back() self.previous_page() if self.num_radio_selected == -1: self.num_radio_selected = self.nb_radios - 1 Chargement en cours
pupitre.py +61 −58 Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff Chargement en cours @@ -5,9 +5,9 @@ # import ---------------------------------- import tkinter as tk from tkinter import ttk, Scale, HORIZONTAL from PIL import Image, ImageTk import csv from vlc import Meta import vlc from PIL import Image, ImageTk mute = False # le son n'est pas coupé au démarrage radio_on = False # mémorise le fait d'écouter une radio ou pas Chargement en cours Chargement en cours @@ -39,30 +39,10 @@ class Pupitre: self.root.attributes('-fullscreen', False) # < à basculer sur False pour les tests sur PC self.root.config(bg=bg_color) # logos des boutons self.icon_back = tk.PhotoImage(file="./icons/back.png") self.icon_play = tk.PhotoImage(file="./icons/play.png") self.icon_pause = tk.PhotoImage(file="./icons/pause.png") self.icon_stop = tk.PhotoImage(file="./icons/stop.png") self.icon_forward = tk.PhotoImage(file="./icons/forward.png") self.icon_sound = tk.PhotoImage(file="./icons/sound_up.png") self.icon_mute = tk.PhotoImage(file="./icons/mute.png") self.icon_pageb = tk.PhotoImage(file="./icons/pageb.png") self.icon_pagef = tk.PhotoImage(file="./icons/pagef.png") self.zones() # affichage des 3 zones self.mosaique() # affichage d'une mosaïque de logos des radios self.boutons() # affichage des boutons self.menu_droite() # affichage de la radio choisie self.radio_name() # affichage de l'info sur l'application self.num_radio_selected = 0 def zones(self): # ==== ZONES DE WIDGETS ========================================== # fenêtre contenant la mosaïque de logos des radios > dim 500x400 self.zone_mosaique = tk.Frame(self.root, bg="lightgray") self.zone_mosaique.place(width="500", height="400", x=10, y=10) self.logos = tk.Frame(self.root, bg="lightgray") self.logos.place(width="500", height="400", x=10, y=10) # fenêtre d'affichage de la radio en cours de lecture et des boutons de commande > dim 300x400 self.menu = tk.Frame(self.root, bg=bg_color) Chargement en cours @@ -72,19 +52,41 @@ class Pupitre: self.bandeau = tk.Frame(self.root, bg=bg_color) self.bandeau.place(width="510", height="60", x=0, y=420) def boutons(self): # ==== FONCTIONS ================================================= self.mosaique() # affichage d'une mosaïque de logos des radios self.right_panel() # affichage de la radio choisie self.radio_name() # affichage de l'info sur l'application self.num_radio_selected = 0 # ==== BOUTONS =================================================== # Logos des boutons self.icon_play = tk.PhotoImage(file="./icons/play.png") self.icon_pause = tk.PhotoImage(file="./icons/pause.png") self.icon_stop = tk.PhotoImage(file="./icons/stop.png") self.icon_previous_radio = tk.PhotoImage(file="./icons/back.png") self.icon_next_radio = tk.PhotoImage(file="./icons/forward.png") self.icon_previous_page = tk.PhotoImage(file="icons/previous_page.png") self.icon_next_page = tk.PhotoImage(file="icons/next_page.png") self.icon_sound = tk.PhotoImage(file="./icons/sound_up.png") self.icon_mute = tk.PhotoImage(file="./icons/mute.png") # définition d'un style commun à tous les boutons style = ttk.Style() style.configure("BW.TLabel", foreground="black", background=bg_color) # bouton page arrière btn_pageb = ttk.Button(self.bandeau, image=self.icon_pageb, command=self.page_back, style="BW.TLabel") btn_pageb.place(width=40, height=32, x=40, y=10) # bouton page précédente btn_previous_page = ttk.Button(self.bandeau, image=self.icon_previous_page, command=self.previous_page, style="BW.TLabel") btn_previous_page.place(width=40, height=32, x=40, y=10) # boutons radio arrière btn_back = ttk.Button(self.bandeau, image=self.icon_back, command=self.radio_back, style="BW.TLabel") btn_back.place(width=48, height=32, x=105, y=10) # boutons radio précédente btn_previous_radio = ttk.Button(self.bandeau, image=self.icon_previous_radio, command=self.previous_radio, style="BW.TLabel") btn_previous_radio.place(width=48, height=32, x=105, y=10) # bouton pause btn_play = ttk.Button(self.bandeau, image=self.icon_pause, command=self.radio_pause, style="BW.TLabel") Chargement en cours @@ -98,21 +100,26 @@ class Pupitre: btn_stop = ttk.Button(self.bandeau, image=self.icon_stop, command=self.radio_stop, style="BW.TLabel") btn_stop.place(width=32, height=32, x=304, y=10) # bouton radio avant btn_forward = ttk.Button(self.bandeau, image=self.icon_forward, command=self.radio_forward, style="BW.TLabel") btn_forward.place(width=48, height=32, x=367, y=10) # bouton radio suivante btn_next_radio = ttk.Button(self.bandeau, image=self.icon_next_radio, command=self.next_radio, style="BW.TLabel") btn_next_radio.place(width=48, height=32, x=367, y=10) # bouton page suivante btn_next_page = ttk.Button(self.bandeau, image=self.icon_next_page, command=self.next_page, style="BW.TLabel") btn_next_page.place(width=40, height=32, x=440, y=10) # bouton page avant btn_pagef = ttk.Button(self.bandeau, image=self.icon_pagef, command=self.page_forward, style="BW.TLabel") btn_pagef.place(width=40, height=32, x=440, y=10) self.btn_mute = ttk.Button(self.menu, image=self.icon_sound, text="Mute", command=self.switch_sound, style="BW.TLabel") self.btn_mute.place(width=30, height=32, x=233, y=430) def menu_droite(self): def right_panel(self): # affiche du logo de la radio sélectionnée >>> placer ici l'icone de la radio en 200x200 # affiche du logo de la radio sélectionnée self.lbl_radio_logo = ttk.Label(self.menu, background=bg_color_light) self.lbl_radio_logo.place(width=225, height=225, x=33, y=33) # affiche le noù de la radio # affiche le nom de la radio self.lbl_radio_name = tk.Label(self.menu) self.lbl_radio_name.place(width=270, height=30, x=10, y=270) self.lbl_radio_name.config(font=('Helvetica', 16), bg=bg_color, fg="white") Chargement en cours @@ -123,11 +130,10 @@ class Pupitre: self.lbl_radio_info.config(font=('Helvetica', 10), anchor="n", bg=bg_color, fg="white", wraplength=240) # potentiomètre de volume # - on charge la configuration du volume sauvegardée lecture = open("config/webradiopi.cfg", "r") lecture = open("config/webradiopi.cfg", "r") # on charge la configuration du volume sauvegardée volume_init = lecture.read() lecture.close() # - affichage du potentiomètre de volume vol_potar = Scale(self.menu, from_=0, to=100, tickinterval=20, orient=HORIZONTAL, length=190, label="Volume", command=self.volume, bg=bg_color, fg="white", highlightthickness=0) Chargement en cours @@ -135,9 +141,6 @@ class Pupitre: vol_potar.place(x=30, y=400) # boutons de coupure et rétablissement du son self.btn_mute = ttk.Button(self.menu, image=self.icon_sound, text="Mute", command=self.switch_sound, style="BW.TLabel") self.btn_mute.place(width=30, height=32, x=233, y=430) def mosaique(self): # récupération de la liste des radios (+infos) et affichage de la mosaïque de logos Chargement en cours Chargement en cours @@ -165,7 +168,7 @@ class Pupitre: self.logo[num_case] = ImageTk.PhotoImage(img) # création du bouton avec le logo de la radio btn_logo = tk.Button(self.zone_mosaique, image=self.logo[num_case]) btn_logo = tk.Button(self.logos, image=self.logo[num_case]) # utilisation d'une fonction 'lambda' indexée sur la position du logo btn_logo.config(command=lambda flux=radios_list[num_radio]['Url'], Chargement en cours Chargement en cours @@ -212,14 +215,14 @@ class Pupitre: self.btn_mute.config(image=self.icon_sound) # affichage "logo sound on" mute = False def page_back(self): # commande de page en arrière def previous_page(self): # commande de page en arrière self.current_page -= 1 if self.current_page < 0: # Quand tente de remonter avant la première page (page 0) self.current_page = self.nb_pages # on boucle sur la dernière self.mosaique() def page_forward(self): # commande page en avant def next_page(self): # commande page en avant self.current_page += 1 if self.current_page > self.nb_pages: # quand on avance au-delà de la dernière page self.current_page = 0 # on revient à la première Chargement en cours @@ -234,7 +237,7 @@ class Pupitre: def radio_info(self): if self.radio_on: # si on a une radio en cours d'écoute flux_info = self.media.get_meta(Meta.NowPlaying) # on récupère l'info sur le titre actuel flux_info = self.media.get_meta(vlc.Meta.NowPlaying) # on récupère l'info sur le titre actuel if flux_info: # si on a bien une information sur le titre longueur = len(flux_info) Chargement en cours