# Autres langages > Python > GUI >  Empecher l'ouverture d'une mme fentre plusieurs fois

## Hardead

Bonjours a tous

Voila je suis dbutant en python et j'ai un problme

J'ai un programme qui m'ouvre une fentre (Nommer fentre1 pour l'explication) sous Tkinter, sur cette mme fentre1 j'ai une zone de clique qui m'ouvre une autre fentre (Nommer fentre2 pour l'explication) mais une fois celle-ci ouverte si je reclique sur la zone de clique de la fentre1, une nouvelle fentre2 apparait (j'en ai donc 2).

Je voudrais donc que la fentre2 ne puisse s'ouvrir qu'une seul fois.

Merci de votre attention.

----------


## wiztricks

Salut,




> Je voudrais donc que la fentre2 ne puisse s'ouvrir qu'une seul fois.


Si vous ne montrez pas votre code, que dire a part que vous devriez modifier le handler du callback qui dclenche l'ouverture de fenetre2?
- W

----------


## Hardead

Voici le code:

def Fenetre2():
     global L1
     F1.destroy ()
     F2=Tk()
     L1= Label(F2, text="Nombre de Cookie")
     L1.pack (side=BOTTOM)
     Fond_2= PhotoImage (file='Fond_2.gif')
     F2.title("PROJET ISN")
     F2.geometry ('700x700+200+10')
     F2.minsize (700,700)
     F2.maxsize (700,700)
     fond2=Canvas(F2,width=700, height=700)
     image_fond=fond2.create_image(500,500,image=Fond_2)
     fond2.pack()
     fond2.bind ('<Button-1>', clique2)
     F2.mainloop ()

def Fenetre3():
    F3=Tk()
    F3.title("PAGE AMELIORATION")
    F3.geometry ('700x700+200+10')
    F3.minsize (700,700)
    F3.maxsize (700,700)
    fond3=Canvas(F3,width=700, height=700)
    #image_fond=fond2.create_image(500,500,image=Fond_2)
    fond3.pack()
    fond3.bind ('<Button-1>', clique3)
    F3.mainloop ()

def clique2 (event):
    if 100<=(event.x)<=200 and 100<=(event.y)<=200: #ouverture de la fentre ame
        Fenetre3 ()


Voila les bout du code en relation avec le problme et je souhaite que la fentre3 ne puisse souvrir qu'en un seul exemplaire.

----------


## psyphi

vive la balise code pour poster des lignes de ton programme. C'est illisible autrement.
Fenetre2 et Fenetre3 ce sont des fonctions ou des mthodes d'une classe?

----------


## Hardead

> #Interface Graphique
> 
> #_________________________________IMPORTATION___________________________________
> from time import *
> from tkinter import *
> from Projet_fonction import *
> 
> #_________________________________DEBUT_FENETRE_________________________________
> 
> ...



Voila le code avec la balise et oui les fentre sont des fonctions.

----------


## psyphi

Bon dans ton cas, le plus simple c'est d'ajouter une variable globale que tu mets  True quand tu ouvres ta fenetre. Ensuite avant de rouvrir ta fentre tu dois vrifier l'tat de cette variable.
Cependant je pense que ton code n'est pas trs propre, pourquoi ta fentre F1 est globale et pas les autres. Normalement ne devrais tu pas n'avoir une fentre principale qui lance la mainloop et gre les autres fenetres.

----------


## Hardead

Merci pour ton aide par rapport au fentre je vais des a prsent la mettre en pratique !

Mais pour la variable global qui fait true ou false par rapport a l'ouverture de la fentre, si la personne ferme la fentre avec la croix de windows ma variable global ne pourra pas changer d'tat et donc la fentre ne pourra plus tre ouverte a nouveau.

----------


## psyphi

> Mais pour la variable global qui fait true ou false par rapport a l'ouverture de la fentre, si la personne ferme la fentre avec la croix de windows ma variable global ne pourra pas changer d'tat et donc la fentre ne pourra plus tre ouverte a nouveau.


Je ne suis pas un expert de Tkinter, mais je suis certain que la fentre envoie un vnement quand elle est ferme par l'utilisateur et que tu dois pouvoir rcuprer cet vnement dans ton code pour mettre la variable global  False.

----------


## wiztricks

Salut,

Je dirais hu?!?
Techniquement, ce que vous faites avec .bind pourra se dfaire avec .unbind.
Apres il faut lire la notice pour apprendre que .bind retourne un identifiant qui pourra tre passe a .unbind
Exemple:


```

```

Lorsqu'on clique "dans" la fentre:


```

```

Puis on dsarme le callback:


```

```

Dans ce cas, la variable globale est l'identifiant du callback.
Vous pouvez utiliser un variable a vous (mais dans ce cas le callback sera toujours appele).
Et comme c'est l'invocation du callback qui effectue .unbind ou passera a False votre variable globale, ca n esera fait qu'une fois.

- W

----------


## Hardead

Merci je vais ds a prsent mettre en pratique ce que vous m'avez dit ! Et reposter un message si je ne parviens pas a la faire fonctionner

----------


## Hardead

J'ai continuer a chercher et trouver la fonction nomdefenetre.protocole(("WM_DELETE_WINDOW", fonction boolene)

ceci permet de rcuprer le fait que l'utilisateur ferme la fentre avec la croix de windows voila

----------

