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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    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
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    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
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    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 Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    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
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    Par défaut
    Salut,

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

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    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()

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/07/2008, 00h24
  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: 09/02/2006, 23h12
  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, 12h41
  4. Réponses: 1
    Dernier message: 25/10/2005, 13h25
  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, 15h15

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