IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

Changer couleur Button et Exécuter une action [Python 3.X]


Sujet :

Tkinter Python

  1. #1
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 610
    Points : 2 074
    Points
    2 074
    Par défaut Changer couleur Button et Exécuter une action
    Bonsoir,
    Un fil sur les webradios m'a donné envie d'utiliser tkinter pour l'améliorer .
    Du coup, je souhaiterais que lorsqu'un Button est sélectionné, il exécute non seulement une commande, mais de plus que sa couleur de fond change (tant qu'un autre Button n'est pas sélectionné).
    J'ai vu pas mal de choses, avec des classes (mais pas fortiche là-dessus).
    J'ai pensé à une variable globale mais sans succès.
    J'en suis rendu là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    import vlc
    import tkinter as tk
     
    wr = [ "http://direct.franceinfo.fr/live/franceinfo-midfi.mp3",
           "http://direct.franceinter.fr/live/franceinter-midfi.mp3",
           "http://direct.fipradio.fr/live/fip-webradio4.mp3",
           "http://cdn.nrjaudio.fm/audio1/fr/30201/mp3_128.mp3",
           "http://direct.francebleu.fr/live/fbarmorique-midfi.mp3",
           "https://ais-live.cloud-services.paris:8443/rfm.mp3",
           "http://cdn.nrjaudio.fm/audio1/fr/30601/mp3_128.mp3",
           "http://icecast.rtl2.fr/rtl2-1-44-128?listen=webCwsBCggNCQgLDQUGBAcGBg.mp3",
           "http://stream.ouifm.fr/ouifm-high.mp3",
           "http://cdn.nrjaudio.fm/adwz1/fr/30407/mp3_128.mp3?origine=fluxradios" ]
     
    vlc = vlc.Instance()
    radio = vlc.media_player_new()
     
    CouleurBouton="white"
     
    def lecture(chaine):
        num_chaine=int(chaine)
        url = wr[num_chaine]
        w = vlc.media_new(url)
        radio.set_media(w)
        radio.play()
     
    #CouleurBouton="grey85"
    def change_color(couleur):
        tk.Button.configure(bg=couleur)
     
    def quitter():
        radio.release()
        root.destroy()
     
    root = tk.Tk()
    root.wm_title("Webradios")
     
    frame1 = tk.Frame(root,bg="#fb0")
    frame1.grid(row=0, column=1, sticky=tk.W+tk.E+tk.N+tk.S)
     
    frame2 = tk.Frame(root,bg='#49A')
    frame2.grid(row=1, column=1, sticky=tk.W+tk.E+tk.N+tk.S)
     
    tk.Button(frame1, text='France Info', command=lambda: [lecture(0),change_color("#51CAF9")]).pack(fill=tk.BOTH,padx=5,pady=5)
    tk.Button(frame1, text='France Inter', command=lambda: lecture(1)).pack(fill=tk.BOTH,padx=5,pady=5)
    tk.Button(frame1, text='FIP Monde', command=lambda: lecture(2)).pack(fill=tk.BOTH,padx=5,pady=5)
    tk.Button(frame1, text='Chérie FM', command=lambda: lecture(3)).pack(fill=tk.BOTH,padx=5,pady=5)
    tk.Button(frame1, text='France Bleu Armorique', command=lambda: lecture(4)).pack(fill=tk.BOTH,padx=5,pady=5)
    tk.Button(frame1, text='RFM', command=lambda: lecture(5)).pack(fill=tk.BOTH,padx=5,pady=5)
    tk.Button(frame1, text='Nostalgie', command=lambda: lecture(6)).pack(fill=tk.BOTH,padx=5,pady=5)
    tk.Button(frame1, text='RTL2', command=lambda: lecture(7)).pack(fill=tk.BOTH,padx=5,pady=5)
    tk.Button(frame1, text='Oui FM', command=lambda: lecture(8)).pack(fill=tk.BOTH,padx=5,pady=5)
    tk.Button(frame1, text='Rires & Chansons', command=lambda: lecture(9)).pack(fill=tk.BOTH,padx=5,pady=5)
     
    tk.Button(frame2, text='Quitter',fg="red",command=quitter).pack(padx=5,pady=5)
     
    tk.mainloop()
    Avec l'erreur suivante lorsque je clique sur le premier bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "/usr/lib/python3.8/tkinter/__init__.py", line 1883, in __call__
        return self.func(*args)
      File "/media/marco5/Disque-4To/Informatique/python_marco/python-radio/radio-vlc-2.py", line 52, in <lambda>
        tk.Button(frame1, text='France Info', command=lambda: [lecture(0),change_color("#51CAF9")]).pack(fill=tk.BOTH,padx=5,pady=5)
      File "/media/marco5/Disque-4To/Informatique/python_marco/python-radio/radio-vlc-2.py", line 37, in change_color
        tk.Button.configure(bg=couleur)
    TypeError: configure() missing 1 required positional argument: 'self'
    Si quelqu'un peut me donner un coup de main, c'est sans doute très simple.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 442
    Points : 37 034
    Points
    37 034
    Par défaut
    Salut,

    Citation Envoyé par marco056 Voir le message
    Si quelqu'un peut me donner un coup de main, c'est sans doute très simple.
    tk.Button.configure est une fonction/méthode qui demande une instance de Button en premier argument. Il faudrait écrire une fonction change_color(button, couleur) pour le récupérer.

    Et reprendre la création des Button pour d'abord créer une Button (et récupérer l'objet), puis associer la fonction a exécuter (puisqu'on a besoin de l'objet) et enfin afficher le Button.

    Ce qui fait écrire 3 lignes au lieu d'une (pour chaque Button), ce qui sera bien plus court avec une boucle sur la liste des noms de stations (le texte de chaque Button).

    - W

  3. #3
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 610
    Points : 2 074
    Points
    2 074
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    tk.Button.configure est une fonction/méthode qui demande une instance de Button en premier argument. Il faudrait écrire une fonction change_color(button, couleur) pour le récupérer.

    Et reprendre la création des Button pour d'abord créer une Button (et récupérer l'objet), puis associer la fonction a exécuter (puisqu'on a besoin de l'objet) et enfin afficher le Button.

    Ce qui fait écrire 3 lignes au lieu d'une (pour chaque Button), ce qui sera bien plus court avec une boucle sur la liste des noms de stations (le texte de chaque Button).

    - W
    J'imaginais que c'était plus simple.
    Je vais me donner le week-end pour tenter de faire cela.
    Merci pour ces idées, je n'aurais pas trouvé tout seul.
    Pour la boucle, je pensais faire cela plus tard mais c'est l'occasion en effet.

  4. #4
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 610
    Points : 2 074
    Points
    2 074
    Par défaut
    Bon, j'ai cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    import vlc
    import tkinter as tk
     
    wr = [ "http://direct.franceinfo.fr/live/franceinfo-midfi.mp3",
           "http://direct.franceinter.fr/live/franceinter-midfi.mp3",
           "http://direct.fipradio.fr/live/fip-webradio4.mp3",
           "http://cdn.nrjaudio.fm/audio1/fr/30201/mp3_128.mp3",
           "http://direct.francebleu.fr/live/fbarmorique-midfi.mp3",
           "https://ais-live.cloud-services.paris:8443/rfm.mp3",
           "http://cdn.nrjaudio.fm/audio1/fr/30601/mp3_128.mp3",
           "http://icecast.rtl2.fr/rtl2-1-44-128?listen=webCwsBCggNCQgLDQUGBAcGBg.mp3",
           "http://stream.ouifm.fr/ouifm-high.mp3",
           "http://cdn.nrjaudio.fm/adwz1/fr/30407/mp3_128.mp3?origine=fluxradios" ]
     
    stations = ['France Info','France Inter','FIP Monde','Chérie FM','France Bleu Armorique','RFM','Nostalgie',\
    'RTL2','Oui FM','Rires & Chansons']
    vlc = vlc.Instance()
    radio = vlc.media_player_new()
     
    CouleurBouton="white"
     
    def lecture(chaine):
        num_chaine=int(chaine)
        print(num_chaine)
        url = wr[num_chaine]
        w = vlc.media_new(url)
        radio.set_media(w)
        radio.play()
     
    def change_color(bouton,couleur="#51CAF9"):
        print(bouton)
        for k in range(len(wr)):
            (buttonList[k]).configure(bg="grey85")
        bouton.configure(bg=couleur)
     
    def quitter():
        radio.release()
        root.destroy()
     
    root = tk.Tk()
    root.wm_title("Webradios")
     
    frame1 = tk.Frame(root,bg="#fb0")
    frame1.grid(row=0, column=1, sticky=tk.W+tk.E+tk.N+tk.S)
     
    frame2 = tk.Frame(root,bg='#49A')
    frame2.grid(row=1, column=1, sticky=tk.W+tk.E+tk.N+tk.S)
     
    buttonColors = []
    buttonList = []
     
    for i in range(len(wr)):
        buttonColors.append("grey85")
        buttonList.append('')
     
    for i, stat in enumerate(stations):
        buttonList[i] = tk.Button(
                frame1,
                text = stat,
                width = 20,
                background = buttonColors[i],
                command = lambda i=i, bouton=buttonList[i]: [lecture(i),change_color(bouton)]
                )
     
        buttonList[i].pack(padx=5,pady=5)
     
    tk.Button(frame2, text='Quitter',fg="red",command=quitter).pack(padx=5,pady=5)
     
    tk.mainloop()
    avec l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "/usr/lib/python3.8/tkinter/__init__.py", line 1883, in __call__
        return self.func(*args)
      File "/media/marco5/Disque-4To/Informatique/python_marco/python-radio/radio-vlc-3.py", line 70, in <lambda>
        command = lambda i=i, bouton=buttonList[i]: [lecture(i),change_color(bouton)]
      File "/media/marco5/Disque-4To/Informatique/python_marco/python-radio/radio-vlc-3.py", line 42, in change_color
        bouton.configure(bg=couleur)
    AttributeError: 'str' object has no attribute 'configure'
    Je pense que c'est à cause de mon "bouton.configure(bg=couleur)" qui ne s'applique pas à l'objet proprement dit. J'ai toujours du mal avec ces objets.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 442
    Points : 37 034
    Points
    37 034
    Par défaut
    Salut,

    Si vous remplissez buttonList avec des chaines vides, que vaut buttonList[i] avant d'y assigner le Button créé?

    - W

  6. #6
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 610
    Points : 2 074
    Points
    2 074
    Par défaut
    Merci wiztricks.
    Ma solution n'est pas des plus élégantes mais elle a le mérite d'effectuer ce que je voulais (je pense ).
    Bonne fin de semaine.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    import vlc
    import tkinter as tk
     
    wr = [ "http://direct.franceinfo.fr/live/franceinfo-midfi.mp3",
           "http://direct.franceinter.fr/live/franceinter-midfi.mp3",
           "http://direct.fipradio.fr/live/fip-webradio4.mp3",
           "http://cdn.nrjaudio.fm/audio1/fr/30201/mp3_128.mp3",
           "http://direct.francebleu.fr/live/fbarmorique-midfi.mp3",
           "https://ais-live.cloud-services.paris:8443/rfm.mp3",
           "http://cdn.nrjaudio.fm/audio1/fr/30601/mp3_128.mp3",
           "http://icecast.rtl2.fr/rtl2-1-44-128?listen=webCwsBCggNCQgLDQUGBAcGBg.mp3",
           "http://stream.ouifm.fr/ouifm-high.mp3",
           "http://cdn.nrjaudio.fm/adwz1/fr/30407/mp3_128.mp3?origine=fluxradios" ]
     
    stations = ['France Info','France Inter','FIP Monde','Chérie FM','France Bleu Armorique','RFM','Nostalgie',\
    'RTL2','Oui FM','Rires & Chansons']
    vlc = vlc.Instance()
    radio = vlc.media_player_new()
     
     
    def lecture(chaine,bouton):
        num_chaine=int(chaine)
        print(num_chaine)
        url = wr[num_chaine]
        w = vlc.media_new(url)
        radio.set_media(w)
        radio.play()
        change_color(bouton)
     
    def change_color(bouton,couleur="#FF9999"):
        for k in range(len(wr)):
            (buttonList[k]).configure(bg="grey85")
        bouton.configure(bg=couleur)
     
    def quitter():
        radio.release()
        root.destroy()
     
    root = tk.Tk()
    root.wm_title("Webradios")
     
    frame1 = tk.Frame(root,bg="#66CCCC")
    frame1.grid(row=0, column=1, sticky=tk.W+tk.E+tk.N+tk.S)
     
    frame2 = tk.Frame(root,bg='#FFFFCC')
    frame2.grid(row=1, column=1, sticky=tk.W+tk.E+tk.N+tk.S)
     
    buttonColors = []
    buttonList = []
     
    for i,stat in enumerate(stations):
        buttonColors.append("grey85")
        buttonList.append(tk.Button(frame1,text = stat,width = 20,background = buttonColors[i]))
     
    for i, stat in enumerate(stations):
        buttonList[i] = tk.Button(frame1,text = stat,width = 20,background = buttonColors[i],\
        command = lambda i=i: lecture(i,buttonList[i]))
     
        buttonList[i].pack(padx=5,pady=5)
     
    tk.Button(frame2, text='Quitter',fg="red",command=quitter).pack(padx=5,pady=5)
     
    tk.mainloop()

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 442
    Points : 37 034
    Points
    37 034
    Par défaut
    Salut,

    Citation Envoyé par marco056 Voir le message
    Ma solution n'est pas des plus élégantes mais elle a le mérite d'effectuer ce que je voulais (je pense ).
    J'admire l'obstination à vouloir faire fonctionner votre idée initiale quitte à compliquer encore plus le code jusqu'à le rendre illisible!

    Confronté à ce genre de situation, je me dis qu'il doit y voir plus simple et je repart dans la documentation ou à la recherche d'exemples.

    A la base le(votre) problème est de passer une référence vers le Button à la fonction appelée lorsqu'on clique dessus.

    Pas facile à faire dans command=... dans la création du Button. Par contre, modifier le button via button.configure(command=...) fonctionne très bien.

    note: ceci dit, une Listbox pour détecter une sélection et visualiser la selection active... (et étant de plus "scrollable") serait peut être un widget plus approprié ici.


    - W

  8. #8
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 610
    Points : 2 074
    Points
    2 074
    Par défaut
    Merci pour ces idées, je n'avais pas trouvé dans la doc le button.configure(command = ...)
    Pour la Listbox, je ne sais pas trop, j'aime bien le visuel obtenu.
    Bon week-end et encore merci pour l'aide et la détection d'erreurs.
    Je ne sais pas si je serai à l'aise un jour avec tkinter : j'ai du mal à appréhender cette programmation événementielle.

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 442
    Points : 37 034
    Points
    37 034
    Par défaut
    Citation Envoyé par marco056 Voir le message
    Je ne sais pas si je serai à l'aise un jour avec tkinter : j'ai du mal à appréhender cette programmation événementielle.
    Il faudrait vous forcer à pratiquer plus souvent: ce n'est pas plus compliqué qu'autre chose.

    - W

  10. #10
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 610
    Points : 2 074
    Points
    2 074
    Par défaut
    Oui, mais ce n'est après tout qu'un loisir pour moi : j'ai enseigné l'informatique sous forme initiation tout au plus.
    Du coup, en 1 minute, j'ai simplifié le programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    import vlc
    import tkinter as tk
     
    wr = [ "http://direct.franceinfo.fr/live/franceinfo-midfi.mp3",
           "http://direct.franceinter.fr/live/franceinter-midfi.mp3",
           "http://direct.fipradio.fr/live/fip-webradio4.mp3",
           "http://cdn.nrjaudio.fm/audio1/fr/30201/mp3_128.mp3",
           "http://direct.francebleu.fr/live/fbarmorique-midfi.mp3",
           "https://ais-live.cloud-services.paris:8443/rfm.mp3",
           "http://cdn.nrjaudio.fm/audio1/fr/30601/mp3_128.mp3",
           "http://icecast.rtl2.fr/rtl2-1-44-128?listen=webCwsBCggNCQgLDQUGBAcGBg.mp3",
           "http://stream.ouifm.fr/ouifm-high.mp3",
           "http://cdn.nrjaudio.fm/adwz1/fr/30407/mp3_128.mp3?origine=fluxradios" ]
     
    stations = ['France Info','France Inter','FIP Monde','Chérie FM','France Bleu Armorique','RFM','Nostalgie',\
    'RTL2','Oui FM','Rires & Chansons']
    vlc = vlc.Instance()
    radio = vlc.media_player_new()
     
     
    def lecture(chaine):
        w = vlc.media_new(wr[int(chaine)])
        radio.set_media(w)
        radio.play()
     
    def change_color(bouton,couleur="#FF9999"):
        for k in range(len(wr)):
            (buttonList[k]).configure(bg="grey85")
        bouton.configure(bg=couleur)
     
    def quitter():
        radio.release()
        root.destroy()
     
    root = tk.Tk()
    root.wm_title("Webradios")
     
    frame1 = tk.Frame(root,bg="#66CCCC")
    frame1.grid(row=0, column=1, sticky=tk.W+tk.E+tk.N+tk.S)
     
    frame2 = tk.Frame(root,bg='#FFFFCC')
    frame2.grid(row=1, column=1, sticky=tk.W+tk.E+tk.N+tk.S)
     
    buttonColors = []
    buttonList = []
     
    for i in range(len((stations))):
        buttonColors.append("grey85")
        buttonList.append(tk.Button(frame1,text = stations[i],width = 20,background = buttonColors[i]))
        buttonList[i].configure(command = lambda i=i: [lecture(i),change_color(buttonList[i])])
        buttonList[i].pack(padx=5,pady=5)
     
    tk.Button(frame2, text='Quitter',fg="red",command=quitter).pack(padx=5,pady=5)
     
    tk.mainloop()

  11. #11
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 610
    Points : 2 074
    Points
    2 074
    Par défaut
    Bonsoir, mon code précédent fonctionne mais j'ai souhaité y ajouter un contrôle du volume.
    Je ne comprends pas l'erreur. Voici mon code avec fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    import vlc
    import tkinter as tk
     
    wr = [ "http://direct.franceinfo.fr/live/franceinfo-midfi.mp3",
           "http://direct.franceinter.fr/live/franceinter-midfi.mp3",
           "http://direct.fipradio.fr/live/fip-webradio4.mp3",
           "http://cdn.nrjaudio.fm/audio1/fr/30201/mp3_128.mp3",
           "http://direct.francebleu.fr/live/fbarmorique-midfi.mp3",
           "https://ais-live.cloud-services.paris:8443/rfm.mp3",
           "http://cdn.nrjaudio.fm/audio1/fr/30601/mp3_128.mp3",
           "http://oceanefm.ice.infomaniak.ch/oceanefm-128.mp3",
           "http://icecast.rtl2.fr/rtl2-1-44-128?listen=webCwsBCggNCQgLDQUGBAcGBg.mp3",
           "http://mfm.ice.infomaniak.ch/mfm-128.mp3",
           "http://broadcast.infomaniak.ch/hitwest-high.mp3",
           "http://stream.ouifm.fr/ouifm-high.mp3",
           "http://cdn.nrjaudio.fm/adwz1/fr/30407/mp3_128.mp3?origine=fluxradios" ]
     
    stations = ['France Info','France Inter','FIP Monde','Chérie FM','France Bleu Armorique','RFM','Nostalgie',\
    'Océane','RTL2','M Radio','Hit West','Oui FM','Rires & Chansons']
    vlc = vlc.Instance()
    radio = vlc.media_player_new()
     
    def lecture(chaine):
        w = vlc.media_new(wr[int(chaine)])
        radio.set_media(w)
        radio.audio_set_volume(100)
        radio.play()
     
    def control_volume(vol=50):
        radio.audio_set_volume(vol)
     
    def change_color(bouton,couleur="#FF9999"):
        for k in range(len(wr)):
            (buttonList[k]).configure(bg="grey85")
        bouton.configure(bg=couleur)
     
    def quitter():
        radio.release()
        root.destroy()
     
    root = tk.Tk()
    root.wm_title("Webradios")
     
    frame1 = tk.Frame(root,bg="#66CCCC")
    frame1.grid(row=0, column=1, sticky=tk.W+tk.E+tk.N+tk.S)
     
    frame2 = tk.Frame(root,bg="#CCFFFF")
    frame2.grid(row=1, column=1, sticky=tk.W+tk.E+tk.N+tk.S)
    vol = tk.IntVar(value=50)
    volume = tk.Scale(frame2, variable=vol,from_=0, to=100, orient=tk.HORIZONTAL,command=control_volume(vol))
    volume.pack(padx=5,pady=5)
     
    frame3 = tk.Frame(root,bg='#FFFFCC')
    frame3.grid(row=2, column=1, sticky=tk.W+tk.E+tk.N+tk.S)
     
    buttonColors = []
    buttonList = []
     
    for i in range(len((stations))):
        buttonColors.append("grey85")
        buttonList.append(tk.Button(frame1,text = stations[i],width = 20,background = buttonColors[i]))
        buttonList[i].configure(command = lambda i=i: [lecture(i),change_color(buttonList[i])])
        buttonList[i].pack(padx=5,pady=5)
     
    tk.Button(frame3, text='Quitter',fg="red",command=quitter).pack(padx=5,pady=5)
     
    tk.mainloop()
    et l’erreur qui est déclenchée à cause de ma commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        volume = tk.Scale(frame2, variable=vol,from_=0, to=100, orient=tk.HORIZONTAL,command=control_volume(vol))
     
      File "/media/marco5/Disque-4To/Informatique/python_marco/python-radio/radio-vlc-4.py", line 40, in control_volume
        radio.audio_set_volume(vol)
     
      File "/usr/local/lib/python3.8/dist-packages/vlc.py", line 4414, in audio_set_volume
        return libvlc_audio_set_volume(self, i_volume)
     
      File "/usr/local/lib/python3.8/dist-packages/vlc.py", line 7959, in libvlc_audio_set_volume
        return f(p_mi, i_volume)
     
    ArgumentError: argument 2: <class 'TypeError'>: wrong type

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 442
    Points : 37 034
    Points
    37 034
    Par défaut
    Salut,

    Citation Envoyé par marco056 Voir le message
    Je ne comprends pas l'erreur. Voici mon code avec fonction
    Si vous appelez une fonction avec un argument et que çà plante en disant c'est quoi le type de l'argument passé... vous devriez savoir quoi regarder.

    - W

  13. #13
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 610
    Points : 2 074
    Points
    2 074
    Par défaut
    Ok, merci, j'ai enlevé l'argument.
    J'ai toujours du mal à comprendre quand il faut mettre un argument dans les fonctions tkinter.
    Ceci dit, le contrôle de volume n'a plus aucun effet.

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 442
    Points : 37 034
    Points
    37 034
    Par défaut
    Citation Envoyé par marco056 Voir le message
    J'ai toujours du mal à comprendre quand il faut mettre un argument dans les fonctions tkinter.
    tkinter est une bibliothèque "évènementielle" autrement dit, çà permet de dire lorsque l'utilisateur clique sur un Button (l'évènement), je veux qu'il se passe (une action)... ce qui se traduit par l'appel d'une fonction.

    Cette fonction étant appelée par tkinter directement, on leur donne le nom de callback. Les paramètres avec lesquels elle sera appelée sont définies par tkinter (c'est lui l'appelant).... donc çà dépend (et si on a écrit une documentation, c'est que c'est pas "intuitif").

    Lire la documentation de Scale au paramètre command, n'est pas une option. Mais vous pouvez préférer la sauce tkdocs ou lire la documentation Tk directement.

    Et pour comprendre, il faut avoir une "lecture active" i.e. arriver à écrire un petit exemple qui colle au cas d'utilisation qu'on veut en faire... Histoire de s'assurer qu'on a bien compris ce que les mots veulent dire.

    - W

  15. #15
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 610
    Points : 2 074
    Points
    2 074
    Par défaut
    J'ai déjà creusé ces notions et les ai utilisées.

    J'ai remis ma variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    vol = tk.IntVar()
    vol.set(50)
    volume = tk.Scale(frame2, variable=vol,from_=0, to=100, orient=tk.HORIZONTAL,command=control_volume(vol=50))
    J'ai l'impression que c'est ma fonction de control qui ne fonctionne pas correctement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def control_volume(vol):
        print(vol)
        radio.audio_set_volume(vol)
    En effet, la variable vol reste à 50.
    Bon, ce n'est pas bien grave, au pire, cela va rester comme cela.

  16. #16
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 442
    Points : 37 034
    Points
    37 034
    Par défaut
    Salut,

    command=control_volume(vol=50) n'est pas la fonction à appeler lorsque... mais le résultat retourné par l'appel (immédiat) de cette fonction. Et ici, c'est None, i.e. il n'y rien à appeler lorsque...

    - W

  17. #17
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 610
    Points : 2 074
    Points
    2 074
    Par défaut
    Merci, je crois que j'ai résolu mon pb, mais sans avoir compris encore pourquoi.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/07/2008, 01h24
  2. Exécuter une action à une heure précise
    Par Rhadamanthe59 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 10/02/2006, 00h12
  3. Exécuter une action quand on ferme le navigateur
    Par Leobaillard dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 08/01/2006, 13h41
  4. Réponses: 1
    Dernier message: 25/10/2005, 14h25
  5. Exécuter une action à la fermeture d'une fenêtre
    Par wwave dans le forum Servlets/JSP
    Réponses: 12
    Dernier message: 28/07/2005, 16h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo