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

GUI Python Discussion :

Récupérer la valeur d'un checkbox défini dans une def à partir d'une autre def


Sujet :

GUI Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2016
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Récupérer la valeur d'un checkbox défini dans une def à partir d'une autre def
    Bonjour,
    Encore un problème de déclaration de variable.
    j'ai une def 'Parametrer' qui définit une fenêtre 'Parametrage' incluant un canvas, une checkbutton et 2 buttons.
    l'un des boutons appelle une autre def pour récupérer la valeur de la checkbutton en plus de fermer la fenêtre 'Parametrage'.
    j'obtiens le message d'erreur suivant indiquant que ma variable de sortie de la checkbutton n'est pas définie:
    global name 'int_Param_Beep' is not defined

    J'ai fait plusieurs essais en vain, j'ai aussi regardé les questions autour de ce sujet dans le forum mais cela ne part jamais de 2 def différentes.
    voici mon code contenant les différents essais en commentaire:
    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
    def main():
        pass
    """Import des librairies"""
    from tkinter import * #librairie graphique
    #global int_Param_Beep
    #int_Param_Beep = IntVar()
     
    """ utilisation des Logs de la console python"""
    logger = logging.getLogger()
    logger.setLevel(logging.DEBUG)
    steam_handler = logging.StreamHandler()
    steam_handler.setLevel(logging.DEBUG)
    logger.addHandler(steam_handler)
    logger.info('Programme demarre')
     
    #int_Param_Beep = IntVar(value=0) # 1: la valeur de la case a cocher
    def Parametrer():
        """ permettre le parametrage du jeu"""
          #Variables locales
        int_Param_Beep = IntVar(value=0) # 1: la valeur de la case lorsqu elle est cochee
     
        #Creation de la fenetre de parametre
        Fenetre_Param = Tk()
        Fenetre_Param.title('Parametrage')
        Fenetre_Param.configure(background="pink")
     
        # Creation d'un widget Button (bouton Quitter)
        Button(Fenetre_Param, text ='Valider', command = lambda var=Fenetre_Param:Parametrer_Quitter(var)).pack(side=BOTTOM,padx=5,pady=5)
     
        #Creation du canevas
        Canevas2 = Canvas(Fenetre_Param, width = 200, height =300, bg ='white')
        Canevas2.pack()
        #Case aÂ* cocher pour les beeps
        Checkbox_Beep = Checkbutton(Canevas2, text = "Activer/Desactiver le son", variable = int_Param_Beep)
        Checkbox_Beep.pack()
        Checkbox_Beep.select()
     
    def Parametrer_Quitter(value):
        """action de quitter la fenetre du parametrage"""
        global int_Param_Beep
        "Ajouter du code pour generer un BIP"
        "............."
        "la valeur value est toujours egale a 0"
        logger.info('afficher la valeur de la case a cocher : %s', int_Param_Beep)
     
        #Quitter la fenetre de parametrage
        value.destroy()
     
     
    """ Creation de la fenetre principale"""
    Mafenetre = Tk()
    Mafenetre.title('MasterMind')
    Mafenetre.configure(background="pink")
     
    """ Creation d'un widget Canvas contenant le plateau du jeu"""
    Canevas = Canvas(Mafenetre, width = 400, height =400, bg ='white')
    Canevas.pack()
     
    # Creation d'un widget Button (bouton Parametrer)
    Button(Mafenetre, text ='Parametrer', command = Parametrer).pack(side=LEFT,padx = 5,pady = 5)
     
    # Creation d'un widget Button (bouton Quitter)
    Button(Mafenetre, text ='Quitter', command = Mafenetre.destroy).pack(side=LEFT,padx=5,pady=5)
     
    Mafenetre.mainloop()

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Vous faites les mêmes erreurs que dans le post précédent.

    Revisez la déclaration des variables globales: çà ne sera pas du luxe.
    Apprenez à programmer avec Tk: je vous ai déjà indiqué un tuto.

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

  3. #3
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2016
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    oui, merci pour cette invitation,
    En effet, c'est le même genre d'erreur. mais je n'arrive pas à déclarer la variable de récupération de la valeur de la checkbutton de type IntVar() dans la def 'main' ni en global d'ailleurs.
    j'ai bien lu le tuto mais cela ne répond as à mon cas particulier.
    merci,

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par CS91PARTY Voir le message
    En effet, c'est le même genre d'erreur. mais je n'arrive pas à déclarer la variable de récupération de la valeur de la checkbutton de type IntVar() dans la def 'main' ni en global d'ailleurs.
    j'ai bien lu le tuto mais cela ne répond as à mon cas particulier.
    Il ne suffit pas de lire un tuto. il faut prendre le temps de comprendre ce que çà implique dans vos codes.
    Ce que vous faites se résume à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> def g():
    ...     bidon = 'xyz'
    ...
    >>> def f():
    ...     global bidon
    ...     print (bidon)
    ...
    Lancez g(), puis f()... et essayez de comprendre pourquoi "NameError".
    Pas la peine d'avoir tout votre code tkinter pour travailler sur ce détail de construction.
    note: si vous voulez apprendre c'est vous qui bossez

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

  5. #5
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2016
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    votre résumé, sorti de mon contexte actuel car je dois utiliser une variable de type IntVar() que je n'arrive pas à déclarer dans le main, est justement différent des exemples du tuto 'mask' ou 'monter' car il essaye de récupérer une variable global d'une def dans une def et non d'une def dans le main.
    je précise que j'utilise python en graphique et non en commande: la commande print ne fonctionne pas dans ce cas. C'est pas gênant mais c'est une précision
    Cepedant, pour répondre à votre question afin de résoudre le cas posé par votre résumé, il suffit de déclarer la variable 'bidon' en global dans la def 'g' pour y mémoriser la valeur 'xyz' et la rendre disponible à partir de la def 'f'
    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
    import logging
    logger = logging.getLogger()
    logger.setLevel(logging.DEBUG)
    steam_handler = logging.StreamHandler()
    steam_handler.setLevel(logging.DEBUG)
    logger.addHandler(steam_handler)
    bidon ='AAA'
    logger.info('Programme demarre, valeur de bidon %s',bidon)
    def g():
        global bidon
        bidon='xyz'
     
    def f():
        global bidon
        logger.info('f %s',bidon)
    g()
    f()
    Dans mon cas, la déclaration IntVar() qui ne se déclare pas dans le main.
    Je continue à chercher de mon côté donc à bosser
    Mais un peu d'aide est toujours appréciable.
    merci,

  6. #6
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2016
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    rien avoir avec tkinter mais j'arrive à utiliser la commande print dans python windows maintenant

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par CS91PARTY Voir le message
    Cepedant, pour répondre à votre question afin de résoudre le cas posé par votre résumé, il suffit de déclarer la variable 'bidon' en global dans la def 'g' pour y mémoriser la valeur 'xyz' et la rendre disponible à partir de la def 'f'
    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
    import logging
    logger = logging.getLogger()
    logger.setLevel(logging.DEBUG)
    steam_handler = logging.StreamHandler()
    steam_handler.setLevel(logging.DEBUG)
    logger.addHandler(steam_handler)
    bidon ='AAA'
    logger.info('Programme demarre, valeur de bidon %s',bidon)
    def g():
        global bidon
        bidon='xyz'
     
    def f():
        global bidon
        logger.info('f %s',bidon)
    g()
    f()
    Pour comprendre ce que vous faites, vous n'avez pas besoin de graphique. De plus la portée des variables est une question de résolution de noms et de portée de variables: peut importe les objets associés à ces noms.
    Effectivement, avec du "global" partout, c'est "ceinture" et "bretelles"... mais un peu bourrin.

    La solution minimaliste serait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> def g(s):
    ...     global bidon
    ...     bidon = s
    ...
    >>> def f():
    ...     print(bidon)
    ...
    i.e. vous avez besoin du mot clé "global" dans les fonctions qui créent/modifient "bidon", pas dans les autres.
    bidon n'est pa definit avant qu'on appele "g":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> bidon
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'bidon' is not defined
    L'appel à "g" crée la variable globale qui est accessible depuis "f":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> g('123')
    >>> bidon
    '123'
    >>> f()
    123
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Juste un petit complément.

    En fait, quand l'interpréteur exécute une fonction qui cite une variable, il cherche d'abord à trouver sa valeur dans les variables locales et dans les arguments passés. S'il ne trouve pas, il cherche au-dessus, ... jusqu'au niveau global.

    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    bidon = 5
     
    def f():
        bidon = 2
        print(bidon) # affichera 2
     
    def g():
        print(bidon) # affichera 5
     
    f()
    g()
    C'est une "souplesse" que je n'aime pas du tout et qui est source de bug. Il suffit en effet d'une faute de frappe dans la déclaration d'une variable locale pour que ce soit la valeur d'une variable globale de même nom qui soit prise. Ce n'est pas très solide comme programmation.

    En ce qui me concerne, je cherche toujours à rendre "étanches" mes fonctions vis-à-vis des variables utilisées: soit elles sont locales, soit elles sont passées en argument. J'aimerais pour ma part qu'il y ait une instruction qui interdise la recherche automatique au niveau global. Et les variables globales doivent être limitées le plus possible: on en crée quand on ne sait pas faire autrement, mais ce n'est pas de la bonne programmation.

    Ou alors on les met dans une classe pour limiter les erreurs par faute de frappe. Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class varglob():
        bidon = 5
     
    def f():
        bidom = 2 # erreur de frappe: 'm' au lieu de 'n'
        print(bidon) # affiche une erreur
     
    def g():
        print(varglob.bidon) # affiche 5
     
    f()
    g()
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par tyrtamos Voir le message
    En ce qui me concerne, je cherche toujours à rendre "étanches" mes fonctions vis-à-vis des variables utilisées: soit elles sont locales, soit elles sont passées en argument. J'aimerais pour ma part qu'il y ait une instruction qui interdise la recherche automatique au niveau global.
    Le plus simple est de stocker ces fonctions "pures" dans un module à part: la portée d'une variable "globale" est limitée au module.

    Citation Envoyé par tyrtamos Voir le message
    Ou alors on les met dans une classe pour limiter les erreurs par faute de frappe. Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class varglob():
        bidon = 5
     
    def f():
        bidom = 2 # erreur de frappe: 'm' au lieu de 'n'
        print(bidon) # affiche une erreur
     
    def g():
        print(varglob.bidon) # affiche 5
     
    f()
    g()
    Pour être cohérent avec ce que vous racontez, il faudrait définir "g" ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def g(varglob):
        print(varglob.bidon) # affiche 5
    C'est une écriture qui questionne quand à la promotion de "g" comme méthode.

    Pour ce qui est du problème du PO, il gagnerait à inclure la déclaration de la fonction "Parametrer_Quitter" dans celle de "Parametrer": les variables locales à "Parametrer" seraient alors accessibles sans "global" par la magie des "closures" - qu'il utilise déjà (sans trop savoir) avec "lambda" -.
    Mais bon, pas facile de voir l'intérêt de l'imparfait du subjonctif alors qu'on souque déjà à construire des phrases simple avec: sujet-verbe-complément.

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

  10. #10
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour wiztricks

    Citation Envoyé par wiztricks Voir le message
    Pour être cohérent avec ce que vous racontez, il faudrait définir "g" ainsi...
    Je préfère aussi!

    Citation Envoyé par wiztricks Voir le message
    C'est une écriture qui questionne quand à la promotion de "g" comme méthode
    Je ne comprends pas cette phrase. Puis-je avoir un complément?
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Je ne comprends pas cette phrase. Puis-je avoir un complément?
    Cela écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class varglob:
        bidon = 5
     
    def g(varglob):
        print(varglob.bidon)
     
    g(varblog)
    on peut imaginer remplacer le nom du paramètre par un X:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def g(X):
        print(X.bidon)
     
    g(varblog)
    "g" accède donc à un objet X devant avoir un attribut "bidon".
    Ca tombe bien X = varblog!

    Mais on peut aussi écrire cela "plus conventionnellement":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def g(self):
        print(self.bidon)
    ou:
    CODE]def g(cls):
    print(cls.bidon)[/CODE]
    On peut garder "g" fonction ou le pousser dans la définition de la classe et en faire une méthode.
    Tout dépend de comment on voudra traduire la relation entre g et varglob (ce qui est toujours sujet à discussion car il y a des '+' et des '-'...)

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

  12. #12
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Ok, merci!
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

Discussions similaires

  1. Récupérer la valeur d'un checkbox dans le contrôleur
    Par momedalhouma dans le forum Spring
    Réponses: 1
    Dernier message: 04/06/2013, 20h35
  2. Réponses: 1
    Dernier message: 30/08/2012, 21h28
  3. récupérer les valeurs d'un checkbox dans une liste
    Par ikouhan dans le forum Struts 1
    Réponses: 19
    Dernier message: 31/08/2010, 14h22
  4. [Checkbox dans ListBox] Récupérer la valeur des contrôles Checkbox
    Par Manson dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 25/05/2009, 10h10
  5. Réponses: 5
    Dernier message: 18/02/2008, 16h11

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