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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du 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
    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
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    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
    Membre du 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
    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
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    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
    Membre du 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
    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
    Membre du 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
    Par défaut
    rien avoir avec tkinter mais j'arrive à utiliser la commande print dans python windows maintenant

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    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

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