Neutraliser l'utilisation d'un "Button" après l'avoir valider une fois [Résolu]

Signaler
Messages postés
30
Date d'inscription
mardi 1 novembre 2011
Statut
Membre
Dernière intervention
28 décembre 2020
-
Messages postés
849
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
15 janvier 2021
-
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

Messages postés
849
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
15 janvier 2021
96
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 ...
Messages postés
13891
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 janvier 2021
782
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()
Messages postés
849
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
15 janvier 2021
96 >
Messages postés
13891
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 janvier 2021

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()
    
Messages postés
13891
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 janvier 2021
782
bonjour,
à quoi correspond la variable
valid
?
nous montres-tu tout ton code?
Messages postés
30
Date d'inscription
mardi 1 novembre 2011
Statut
Membre
Dernière intervention
28 décembre 2020

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
Messages postés
849
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
15 janvier 2021
96
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 ....
Messages postés
30
Date d'inscription
mardi 1 novembre 2011
Statut
Membre
Dernière intervention
28 décembre 2020

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()
####################################################
Messages postés
30
Date d'inscription
mardi 1 novembre 2011
Statut
Membre
Dernière intervention
28 décembre 2020

Merci Phil et bravo yg_be pour l'explication.

Joyeuses fêtes à vous 2.
Claude