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

Python Discussion :

Changer la couleur d'un bouton tkinter


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2019
    Messages : 20
    Par défaut Changer la couleur d'un bouton tkinter
    Bonjour,
    Dans une fonction je voudrais changer la couleur d'un bouton déjà affiché. Après des recherches j'ai trouvé la méthode config. Donc sur mon bouton appelé p1, j'ai écrit: p1.configure(bg="#51CAF9"). Le problème est que j'ai un message d'erreur qui est dû, si j'ai bien compris, au fait que j'ai déjà fait p1.pack() avant. Existe-t-il un moyen de "unpack" un widget pour pouvoir le modifier? Ou alors est-il possible de modifier un widget déjà afficher? Parce que pour l'instant la seule solution que je vois est de supprimer le bouton pour le remplacer par un nouveau avec la bonne couleur, mais je me doute qu'il y a plus simple...

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 701
    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 701
    Par défaut
    Salut,

    Il n'y a aucun problème pour modifier un widget déjà affiché via "pack": si c'est le cas, postez un code qui permette de le reproduire!
    Car chez moi si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> from tkinter import Button
    >>> w  =Button()
    >>> w.pack()
    >>> w.configure(bg="#51CAF9")
    >>> w.update()
    >>>
    il n'y a pas d'erreur (et çà fonctionne comme documenté).

    Sinon pour "défaire" .pack, c'est .pack_forget

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

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> from tkinter import Button
    >>> w  =Button()
    >>> w.pack()
    >>> w.configure(bg="#51CAF9")
    >>> w.update()
    >>>
    - W
    Théoriquement même pas besoin de faire update()!

    Par exemple une fonction que j'ai pour faire clignoter un bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def blink(obj,nb=5,color=None):
    	ct = 0
    	if color is None:
    		color = obj.cget('bg')
    	if color == "white":
    		return
    	while ct < nb or (nb==-1 and not stopBlink):
    		obj.config(bg="white")
    		time.sleep(0.07)
    		obj.config(bg=color)
    		time.sleep(0.07)
    		ct+=1

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2019
    Messages : 20
    Par défaut
    Merci pour vos réponses. J'ai peut-être un autre problème que je n'ai pas reconnu alors.
    Voici le code d'erreur que j'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Traceback (most recent call last):
      File "C:\Users\Léo\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1705, in __call__
        return self.func(*args)
      File "C:/Users/Léo/PycharmProjects/maths2/Quiz + interface.py", line 117, in <lambda>
        boutonchoix['command']=lambda : [boutonchoix.destroy(),LancerQuiz()]
      File "C:/Users/Léo/PycharmProjects/maths2/Quiz + interface.py", line 97, in LancerQuiz
        QuestionSuivante()
      File "C:/Users/Léo/PycharmProjects/maths2/Quiz + interface.py", line 75, in QuestionSuivante
        eval("p" + str(i+1)).configure(bg="#5AFE29")
      File "C:\Users\Léo\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1485, in configure
        return self._configure('configure', cnf, kw)
      File "C:\Users\Léo\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1476, in _configure
        self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
    _tkinter.TclError: invalid command name ".!frame2.!frame.!button"

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 701
    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 701
    Par défaut
    Salut,

    A priori, TCL jette un "_tkinter.TclError: invalid command name" lorsque le widget correspondant a été détruit.
    Ce qui veut dire que vous avez un problème de logique dans votre code qu'on ne peut résoudre en regardant seulement le message d'erreur.

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

  6. #6
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 918
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    Théoriquement même pas besoin de faire update()!

    Par exemple une fonction que j'ai pour faire clignoter un bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def blink(obj,nb=5,color=None):
    	ct = 0
    	if color is None:
    		color = obj.cget('bg')
    	if color == "white":
    		return
    	while ct < nb or (nb==-1 and not stopBlink):
    		obj.config(bg="white")
    		time.sleep(0.07)
    		obj.config(bg=color)
    		time.sleep(0.07)
    		ct+=1
    Bonjour,
    Pour faire clignoter un Button, il suffit de lui appliquer le méthode flash() ...

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2019
    Messages : 20
    Par défaut
    D'accord merci, voilà la fonction en question:
    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
     
     
    from random import randint, shuffle
    from tkinter import *
    import time
    from time import sleep
     
     
    class question:
        def __init__(self,enonce,p1,p2,p3,p4):
            self.enonce=enonce
            self.p1=p1
            self.p2=p2
            self.p3=p3
            self.p4=p4
     
    Q1=question("Quelle est la capitale de Madagascar?","Antananarivo","Lilongwe","Mogadiscio","Mbabane")
    Q2=question("Quelle est la capitale du Portugal","Lisbonne","Porto","Salamanca","Cordoba")
    Q3=question("Quelle est la capitale de la Finlande","Helsinki","Oslo","Stockholm","Malmö")
    Q4=question("Qu'est ce qu'un axolotl?","Une salamandre","Un insecte","Un oiseau", "un Poisson")
    Q5=question("Quelle est la capitale de la Suisse?","Berne","Vienne","Zurich","Genève")
    Q6=question("Quelle est la concentration moyenne en sel d'un océan?","35 g/l","3.5 g/l","350g/l","0.35g/l")
    Q7=question("À quel pays appartient le Groenland?","Le Danemark", "L'Islande", "Le Canada","C'est un pays indépendant")
    Q8=question("Combien de dents possède une vache?","32","24","40","18")
    Q9=question("Qui a écrit la saga Harry Potter ?","J.K. Rowling", "J.R.R. Tolkien", "Stephenie Meyer", "George R.R. Martin")
    Q10=question("En quelle année est sorti le premier Iphone?","2007","2005","2006","2008")
     
    CouleurFond="#51CAF9"
    CouleurBouton="#BBF4FC"
    N=10
    v = 0
    F = []
     
     
     
     
    def QuestionSuivante():
     
        global F,v
        k = randint(1, N)
        while k in F:
            k=randint(1,N)
        F.append(k)
        Q=eval("Q"+str(k))
     
        rep=[]
        label = Label(w, text=Q.enonce, font=("courrier", 20), bg=CouleurFond)
        prop = Frame(w, bg=CouleurFond)
        prop1 = Frame(prop, bg=CouleurFond)
        prop2 = Frame(prop, bg=CouleurFond)
        p = [Q.p1, Q.p2, Q.p3, Q.p4]
        shuffle(p)
        p1 = Button(prop1, text=p[0], font=("courrier", 20), bg=CouleurBouton, width=20, cmd=rep.append(p[0]))
        p2 = Button(prop1, text=p[1], font=("courrier", 20), bg=CouleurBouton, width=20, cmd=rep.append(p[1]))
        p3 = Button(prop2, text=p[2], font=("courrier", 20), bg=CouleurBouton, width=20, cmd=rep.append(p[2]))
        p4 = Button(prop2, text=p[3], font=("courrier", 20), bg=CouleurBouton, width=20, cmd=rep.append(p[3]))
        p1.pack(side=LEFT, padx=15, pady=15)
        p2.pack(side=LEFT, padx=15, pady=15)
        p3.pack(side=RIGHT, padx=15, pady=15)
        p4.pack(side=RIGHT, padx=15, pady=15)
        prop1.pack()
        prop2.pack()
        label.pack(side=TOP, pady=100)
        prop.pack(side=BOTTOM, pady=100)
        w.mainloop()
     
        #start=time.time()
        #while time.time()-start < 3:           time.sleep(0.07)
        #    None
     
        if rep==list(Q.p1):
            v+=1
        for i in range(4):
            if p[i]==Q.p1:
                eval("p" + str(i+1)).configure(bg="#5AFE29")
        w.mainloop()
     
     
    def LancerQuiz():
     
        n=int(Text1.get('1.0',END))
        if n>N:
            boutonchoix = Button(w, text="Valider", font=("courrier", 20), bg=CouleurBouton, width=20)
            boutonchoix['command'] = lambda: [boutonchoix.destroy(), LancerQuiz()]
            boutonchoix.pack(pady=100)
            try:
                texteerreur.destroy()
            except: UnboundLocalError
            texteerreur = Label(frameintro, text="Vous devez choisir un nombre inférieur à "+str(N), font=("courrier", 20),bg=CouleurFond)
            texteerreur.pack()
            w.mainloop()
            while n>N:
                None
            boutonchoix.destroy()
        frameintro.destroy()
     
        QuestionSuivante()
     
     
     
    w=Tk()
    q=0
    p1,p2,p3,p4=0,0,0,0
    w.geometry("1080x720")
    w.minsize(540,360)
    w.iconbitmap("logo.ico")
    w.title("Super Quiz")
    w.config(background=CouleurFond)
     
    frameintro=Frame(w,bg=CouleurFond)
    texteintro=Label(frameintro, text="Choisir le nombre de question:",font=("courrier",20),bg=CouleurFond)
    Text1 = Text(frameintro, width=60, height=1 , font=("Courrier",20))
    texteintro.pack()
    Text1.pack(pady=20)
    frameintro.pack(expand=YES)
    boutonchoix=Button(w,text="Valider",font=("courrier",20),bg=CouleurBouton,width=20)
    boutonchoix['command']=lambda : [boutonchoix.destroy(),LancerQuiz()]
    boutonchoix.pack(pady=100)
    w.mainloop()


    Le problème se trouve dans la fonction Questionsuivante(), j'ai remarqué que si je supprime le premier w.mainloop() de la fonction, le changement de couleur fonctionne, mais dans ce cas là je n'obtiens pas ce que je recherche. J'aimerais d'abord avoir les 4 boutons de la même couleur, et seulement après que le bouton correspondant à la bonne réponse change de couleur.

    Et si possible j'ai un autre petit problème sur ce code pas vraiment dérangeant mais que j'aimerais corriger, dans la partie 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
    def LancerQuiz():
     
        n=int(Text1.get('1.0',END))
        if n>N:
            boutonchoix = Button(w, text="Valider", font=("courrier", 20), bg=CouleurBouton, width=20)
            boutonchoix['command'] = lambda: [boutonchoix.destroy(), LancerQuiz()]
            boutonchoix.pack(pady=100)
            try:
                texteerreur.destroy()
            except: UnboundLocalError
            texteerreur = Label(frameintro, text="Vous devez choisir un nombre inférieur à "+str(N), font=("courrier", 20),bg=CouleurFond)
            texteerreur.pack()
            w.mainloop()
            while n>N:
                None
            boutonchoix.destroy()
        frameintro.destroy()
    Si par exemple l'utilisateur entre 3 fois un nombre trop grand, le texteerreur se sera afficher 3 fois, j'ai essayé de remedier à ce problème n supprimant le texte avant de le réafficher à chaque fois avec le try/except, mais ça ne marche pas...

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 701
    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 701
    Par défaut
    Salut,

    Citation Envoyé par leo88000 Voir le message
    Le problème se trouve dans la fonction Questionsuivante(), j'ai remarqué que si je supprime le premier w.mainloop() de la fonction, le changement de couleur fonctionne, mais dans ce cas là je n'obtiens pas ce que je recherche.
    Appeler plusieurs fois .mainloop dans son code est possible mais pouvoir l'utiliser proprement demande des connaissances tkinter.

    Connaissances qui permettent d'éviter d'avoir à le faire dans la plupart des cas (sauf ceux où on ne peut faire autrement mais dans ce cas on sait pourquoi on en est réduit à... et on assume les implications).

    Tout çà pour vous dire que votre code est mal construit: vous avez répété, essayé de généraliser des bouts de solutions sans (pouvoir) penser à la logique d'ensemble.

    A la fin quand çà devient un peu trop touffu, tout se casse la gueule comme pour un château de carte.

    Je n'ai pas de solution: juste vous proposer de passer du temps dans un tuto. pour apprendre les bases et à construire proprement un programme (plutôt que de bricoler en espérant que çà tombe en marche).
    Désolé.

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

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2019
    Messages : 20
    Par défaut
    D'accord merci, c'est ce que je vais essayer de faire alors :-)

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Hominidé Voir le message
    Bonjour,
    Pour faire clignoter un Button, il suffit de lui appliquer le méthode flash() ...
    Oh ?! Je connaissais pas !

Discussions similaires

  1. Changer la couleur d'un bouton
    Par bruno.wiesen dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 17/04/2007, 11h13
  2. Changer la couleur d'un bouton
    Par castel51 dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 02/11/2006, 10h36
  3. Réponses: 4
    Dernier message: 31/07/2006, 16h18
  4. Changer la Couleur d'un bouton
    Par fpinter dans le forum VC++ .NET
    Réponses: 4
    Dernier message: 15/07/2006, 12h09
  5. changer la couleur d'un bouton
    Par xenos dans le forum Delphi
    Réponses: 20
    Dernier message: 24/05/2006, 17h10

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