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

Tkinter Python Discussion :

fermer une fenêtre d'une def à partir d'une autre def


Sujet :

Tkinter 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 fermer une fenêtre d'une def à partir d'une autre def
    Bonjour,
    J'utilise Python 3.2.1
    je cherche à fermer une fenêtre ouverte dans une def via une autre def sans obtenir le message d'erreur suivant:
    Global name 'Canevas2' is not defined.
    En clair: j'ai une def appelée 'Parametrer' dans laquelle je créé une fenêtre 'Parametrage' contenant un canvas et 2 boutons. L'un des boutons appelle une def nommée 'Parametrer_Quitter' afin d'exécuter des trucs en plus de fermer la fenêtre 'Parametrage'. Mais lors du click sur ce bouton, j'obtiens le message d'erreur ci-dessus. C'est un problème de déclaration de variable que je ne comprends pas
    Voici mon code:
    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
    def main():
        pass
     
    """Import des librairies"""
    from tkinter import * #librairie graphique
     
    def Parametrer():
        """ permettre le parametrage du jeu"""
          #Variables glocales
        int_Param_Beep = IntVar(value=0) # 1: la valeur de la case a cocher
     
        #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=int_Param_Beep: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"""
        "Ajouter du code pour generer un BIP"
        "............."
        "la valeur value est toujours egale a 0"
        #Quitter la fenetre de parametrage
        Canevas2.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 302
    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 302
    Points : 36 801
    Points
    36 801
    Par défaut
    Salut,

    Citation Envoyé par CS91PARTY Voir le message
    je cherche à fermer une fenêtre ouverte dans une def via une autre def sans obtenir le message d'erreur suivant:
    Global name 'Canevas2' is not defined.
    Apparemment, vous ne savez pas trop ce que sont variables locales/globales. Je ne vais pas m'étendre la dessus, vous avez des tutos qui ont été faits pour vous raconter tout çà en détails. Profitez en aussi pour regarder comment on programme avec tkinter: c'est pas trivial, si vous ne passez pas un peu de temps à essayer de comprendre vous allez perdre beaucoup de temps à essayer de comprendre des comportements "étranges".
    Bon courage.

    - W

  3. #3
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par CS91PARTY Voir le message
    Bonjour,
    J'utilise Python 3.2.1
    je cherche à fermer une fenêtre ouverte dans une def via une autre def sans obtenir le message d'erreur suivant:
    Global name 'Canevas2' is not defined.
    En clair: j'ai une def appelée 'Parametrer' dans laquelle je créé une fenêtre 'Parametrage' contenant un canvas et 2 boutons. L'un des boutons appelle une def nommée 'Parametrer_Quitter' afin d'exécuter des trucs en plus de fermer la fenêtre 'Parametrage'. Mais lors du click sur ce bouton, j'obtiens le message d'erreur ci-dessus. C'est un problème de déclaration de variable que je ne comprends pas
    Voici mon code:
    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
    def main():
        pass
     
    """Import des librairies"""
    from tkinter import * #librairie graphique
     
    def Parametrer():
        """ permettre le parametrage du jeu"""
          #Variables glocales
        int_Param_Beep = IntVar(value=0) # 1: la valeur de la case a cocher
     
        #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=int_Param_Beep: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"""
        "Ajouter du code pour generer un BIP"
        "............."
        "la valeur value est toujours egale a 0"
        #Quitter la fenetre de parametrage
        Canevas2.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()
    Bonjour,
    Déjà, deux gestionnaires de fenêtres sont ouverts, ce qui n'est pas génial.
    D'autre part, il faut que "Canevas2" soit global, ou transmis en paramètre.

    Clodion
    PS: les variables ne doivent pas être en majuscules et les noms ne doivent pas être des mots réservé (ou proches).
    PS2: si l'objectif est de fermer la "nouvelle" fenêtre, ce n'est pas le canevas qu'il faut détruire, mais la fenêtre.

  4. #4
    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
    Bonjour,
    Merci pour vos réponses,
    En effet, mon problème vient de la déclaration de variable mais je ne sais pas comment le résoudre car nous parlons d'un type d'objet: fenêtre et non une variable standard genre int, long ou autre.
    j'ai effectivement essayé de fermer la fenêtre au lieu du canvas en vain remplacement de Canevas2.destroy() par Fenetre_Param.destroy()
    Je comprends bien la différence entre une variable globale et locale, j'ai aussi suivi le tuto. Mais cela ne répond pas au besoin actuel.
    J'utilise 2 fenêtres car la première est la principale et la deuxième permet à l'utilisateur d'effectuer des actions.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par CS91PARTY Voir le message
    Bonjour,
    Merci pour vos réponses,
    En effet, mon problème vient de la déclaration de variable mais je ne sais pas comment le résoudre car nous parlons d'un type d'objet: fenêtre et non une variable standard genre int, long ou autre.
    j'ai effectivement essayé de fermer la fenêtre au lieu du canvas en vain remplacement de Canevas2.destroy() par Fenetre_Param.destroy()
    Je comprends bien la différence entre une variable globale et locale, j'ai aussi suivi le tuto. Mais cela ne répond pas au besoin actuel.
    J'utilise 2 fenêtres car la première est la principale et la deuxième permet à l'utilisateur d'effectuer des actions.
    Bonsoir,
    Quant au "global", dans le post précédent, je donne la solution… Identique pour n'importe quel objet (tout est objet en Python [même le signe "+"]).
    En "tkinter", une fenêtre secondaire est un "Toplevel", pas une autre instance de "tkinter", sinon vous perdez tout lien avec le reste.

    Clodion

  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
    Merci,j'ai passé la valeur pour résoudre le problème.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 10/05/2012, 14h35
  2. Création d'une image à partir d'une fenêtre
    Par bbkenny dans le forum VBScript
    Réponses: 10
    Dernier message: 27/03/2011, 04h11
  3. Ouvrir une fenêtre en pop-up à partir d'une fenêtre pop-up
    Par beji15 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 13/02/2008, 19h41
  4. Réponses: 3
    Dernier message: 01/02/2008, 09h29
  5. Modifier un champ à partir d'une fenêtre modale
    Par ahoyeau dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 08/03/2005, 16h53

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