Neutraliser l'utilisation d'un "Button" après l'avoir valider une fois

Résolu
cvan85 Messages postés 59 Statut Membre -  
Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
Je n'arrive pas à trouver la syntaxe exacte pour réaliser le contrôle suivant :

Ne pas autoriser une seconde fois l'utilisation d'un bouton.
J'ai tenté plusieurs syntaxes trouver dans la littérature en ligne mais j'ai une erreur à chaque fois.

En attachement, la création du bouton dans le main et dans la procédure la tentative (infructueuse) de désactivation.

Merci de votre coup de main.
Claude

Button(can_gen, text='Démarrer\nune partie',bg='#FFE4C4',fg='red',command = lambda : lancement(mat)).place(x=10, y= 370)


def lancement(matr):
    global valid
    palette.clear
#valid['state'] = DISABLED
    valid.config(state = DISABLED)


A l'exécution j'ai l'erreur suivante : AttributeError: 'NoneType' object has no attribute 'config'
Même résultat avec la ligne mise en commentaire ds la proc.

6 réponses

  1. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    J'ai essayé ça et ca marche:

    lanc = Button(can_gen, text='Démarrer\nune partie',bg='#FFE4C4',fg='red',command = lambda : lancement(mat))
    lanc.place(x=10, y= 370)


    pourquoi ca ne marche pas avec le place en fin de button, ne me demande pas pourquoi ...
    1
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      n'est-ce pas logique?
      lanc=Button()
      plac=Button().place()

      lanc est ce que retourne la fonction Button
      plac est ce que retourne la fonction place
      on voudrait sinon écrire
      (lanc=Button()).place()
      0
      1. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Bonjour yg_be,

        C'est bien ça

        J'ai fait des tests ensuite pour imprimer les types des valeurs de retour

        Je ne suis jamais tombé sur le problème car je fait toujours ça en 2 instructions :

        b1=Button()
        b1.place()
            
        0
  2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour,
    à quoi correspond la variable
    valid
    ?
    nous montres-tu tout ton code?
    0
  3. cvan85 Messages postés 59 Statut Membre 1
     
    Autant pour moi, je n'ai pas posté les bonnes lignes de code (pb de version)
    Désolé.

    Voilà les bonnes lignes.

    Ds le prog principal:
    lanc = Button(can_gen, text='Démarrer\nune partie',bg='#FFE4C4',fg='red',command = lambda : lancement(mat)).place(x=10, y= 370)


    Ds la proc.

    def lancement(matr):
        global lanc
        palette.clear
        lanc['state'] = DISABLED
    #lanc.config(state = DISABLED)


    Ds les 2 cas(ligne active ou ligne commentée ds la proc même erreur :
    File "/Users/..././PYTHON/prog/AZ_V4.py", line 34, in lancement
        lanc['state'] = DISABLED
    TypeError: 'NoneType' object does not support item assignment


    Claude
    0
  4. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    Bonsoir Claude,

    ca a l'air OK

    tu applique bien le 'state' au bouton identifié par la variable lanc

    Mais l'erreur dit que lanc est de type NoneType

    Il faudrait voir dans quel ordre tu as mis tout ça, donc le code complet ....
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. cvan85 Messages postés 59 Statut Membre 1
     
    Bonsoir Phil,

    Merci pour ton retour.
    Voilà le code complet.

    #!/usr/bin/env python3.9
    #######################
    #                     #
    # Jeu AZ  V 4.0       #
    #                     #
    #######################
    
    #import pdb; pdb.set_trace()
    from tkinter import *
    import random 
    import time
    
    ###### Définition des fonctions ##############
    def aff_widg(canva):
        for i in range(5):
            for j in range(5):
                canva.create_rectangle((40*(i+1),40*(j+1)),((40*(i+1)+40),40*(j+1)+40))
        
    #def maj_palette(co):
    #########
    # mettre à jour le dico  par +1  sur couleur tirée
    
        
    def sel_coul():
        ind=random.randint(1,7)
        coul=choix[ind-1]
        palette[coul] +=1
        return coul
    
    ####Début de partie    
    def lancement(matr):
        global lanc
        palette.clear
        lanc['state'] = DISABLED
    #lanc.config(state = DISABLED)
        for c in range(7):
            palette[choix[c-1]] = 0
        for i in range(5):
            couleur=sel_coul()
            can_gen.create_rectangle(((40*(i+1),40),((40*(i+1)+40),40+40)), fill=couleur,width=2, outline='black')
            lig_courant[i]=couleur
        matr[0]=lig_courant
        fd.write(lig_courant[0]+lig_courant[1]+lig_courant[2]+lig_courant[3]+lig_courant[4])
        Label(can_gen, text= "Pour chaque ligne supplémentaire\n cochez 2 cases et validez",bg='#FEFEE2',fg='blue').place(x=40, y= 310)
            
        
        
    def autre_tirage(matrice):
        global lig_courant
        global ind_prec
        
        nb_case = 0
        if (r_v_c1.get()):
            nb_case=nb_case + 1
        if (r_v_c2.get()):
            nb_case=nb_case + 1
        if (r_v_c3.get()):
            nb_case=nb_case + 1
        if (r_v_c4.get()):
            nb_case=nb_case + 1
        if (r_v_c5.get()):
            nb_case=nb_case + 1
    
        if nb_case != 2:
            Label(can_gen, text= "Attention ne cochez que 2 cases!     " ,bg='#FEFEE2',fg='red').place(x=40, y= 310) 
            r_v_c1.set(False)
            r_v_c2.set(False)
            r_v_c3.set(False)
            r_v_c4.set(False)
            r_v_c5.set(False) 
        else:
            if(matrice[1][0]=='vide'):
                    lig=2
                    ind_prec=0
            elif (matrice[2][0]=='vide'): 
                    lig=3
                    ind_prec=1
            elif (matrice[3][0]=='vide'):
                    lig=4
                    ind_prec=2
            elif (matrice[4][0]=='vide'):
                    lig=5
                    ind_prec=3
            
            if (r_v_c1.get()):
                couleur=sel_coul()
                col=1
                can_gen.create_rectangle(((40*(col),40*(lig)),((40*(col)+40),40*(lig)+40)), fill=couleur,width=2, outline='black')
                lig_courant[0]=couleur
                r_v_c1.set(False)
            else:
                col=1
                can_gen.create_rectangle(((40*(col),40*(lig)),((40*(col)+40),40*(lig)+40)), fill=matrice[ind_prec][0],width=2, outline='black')
                lig_courant[0]=matrice[ind_prec][0]
                
            if (r_v_c2.get()):
                couleur=sel_coul()
                col=2
                can_gen.create_rectangle(((40*(col),40*(lig)),((40*(col)+40),40*(lig)+40)), fill=couleur,width=2, outline='black')
                lig_courant[1]=couleur
                r_v_c2.set(False)
            else:
                col=2
                can_gen.create_rectangle(((40*(col),40*(lig)),((40*(col)+40),40*(lig)+40)), fill=matrice[ind_prec][1],width=2, outline='black')
                lig_courant[1]=matrice[ind_prec][1]
                
            if (r_v_c3.get()):
                couleur=sel_coul()
                col=3
                can_gen.create_rectangle(((40*(col),40*(lig)),((40*(col)+40),40*(lig)+40)), fill=couleur,width=2, outline='black')
                lig_courant[2]=couleur
                r_v_c3.set(False)
            else:
                col=3
                can_gen.create_rectangle(((40*(col),40*(lig)),((40*(col)+40),40*(lig)+40)), fill=matrice[ind_prec][2],width=2, outline='black')
                lig_courant[2]=matrice[ind_prec][2]
                
            if (r_v_c4.get()):
                couleur=sel_coul()
                col=4
                can_gen.create_rectangle(((40*(col),40*(lig)),((40*(col)+40),40*(lig)+40)), fill=couleur,width=2, outline='black')
                lig_courant[3]=couleur
                r_v_c4.set(False)
            else:
                col=4
                can_gen.create_rectangle(((40*(col),40*(lig)),((40*(col)+40),40*(lig)+40)), fill=matrice[ind_prec][3],width=2, outline='black')
                lig_courant[3]=matrice[ind_prec][3]
                
            if (r_v_c5.get()):
                couleur=sel_coul()
                col=5
                can_gen.create_rectangle(((40*(col),40*(lig)),((40*(col)+40),40*(lig)+40)), fill=couleur,width=2, outline='black')
                lig_courant[4]=couleur
                r_v_c5.set(False)
            else:
                col=5
                can_gen.create_rectangle(((40*(col),40*(lig)),((40*(col)+40),40*(lig)+40)), fill=matrice[ind_prec][4],width=2, outline='black')
                lig_courant[4]=matrice[ind_prec][4]
            ind_cour=ind_prec + 1    
            matrice[ind_cour]=lig_courant
            fd.write(lig_courant[0]+lig_courant[1]+lig_courant[2]+lig_courant[3]+lig_courant[4])
            
                
    def rien():
        return 1
    
    ####### Programme principal ###################### 
    # Définitions des variables globales    
    choix = ['blue','green','red','yellow','purple','pink','white']
    ind_prec = 0
    palette = {}
    lig_courant =['vide','vide','vide','vide','vide']
    mat = [['vide','vide','vide','vide','vide'],['vide','vide','vide','vide','vide'],['vide','vide','vide','vide','vide'],['vide','vide','vide','vide','vide'],['vide','vide','vide','vide','vide']]
    
    ####### Début du programme principal #############
    fd=open('mat_file','w')
    fen1=Tk()
    fen1.title("Jeu AZ V4.0")
    fen1.geometry("420x470")
    can_gen=Canvas(fen1, width=360, height=410, bg ="#FEFEE2")
    can_gen.place(x=30,y=30)
    aff_widg(can_gen)
    r_v_c1 = BooleanVar(value=False)
    r_v_c2 = BooleanVar(value=False)
    r_v_c3 = BooleanVar(value=False)
    r_v_c4 = BooleanVar(value=False)
    r_v_c5 = BooleanVar(value=False)
    c1 = Checkbutton(can_gen, text = "1", height = 2, width = 5,bg ="#FEFEE2",variable= r_v_c1).place(x=40,y=280)
    c2 = Checkbutton(can_gen, text = "2", height = 2, width = 5,bg ="#FEFEE2",variable= r_v_c2).place(x=80,y=280)
    c3 = Checkbutton(can_gen, text = "3", height = 2, width = 5,bg ="#FEFEE2",variable= r_v_c3).place(x=120,y=280)
    c4 = Checkbutton(can_gen, text = "4", height = 2, width = 5,bg ="#FEFEE2",variable= r_v_c4).place(x=160,y=280)
    c5 = Checkbutton(can_gen, text = "5", height = 2, width = 5,bg ="#FEFEE2",variable= r_v_c5).place(x=200,y=280)
    valid = Button(can_gen, text = "Validez", height = 2, width = 7,bg ="#FEFEE2",fg='red',command = lambda: autre_tirage(mat)).place(x=295,y=280)
    
    lanc = Button(can_gen, text='Démarrer\nune partie',bg='#FFE4C4',fg='red',command = lambda : lancement(mat)).place(x=10, y= 370)
    Button(can_gen, text='FIN \nde partie',bg='#AD4F09',fg='red', command = fen1.quit).place(x=250,y=370)
    
    ####### Boucle d'attente d'évènements ##############
    fen1.mainloop()
    
    ####### Effacement fenêtre - Sortie programme ######
    fd.close
    fen1.destroy()
    ####################################################
    
    0
  7. cvan85 Messages postés 59 Statut Membre 1
     
    Merci Phil et bravo yg_be pour l'explication.

    Joyeuses fêtes à vous 2.
    Claude
    0