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 :

Empecher l'ouverture d'une même fenêtre plusieurs fois


Sujet :

GUI Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2014
    Messages : 10
    Points : 2
    Points
    2
    Par défaut Empecher l'ouverture d'une même fenêtre plusieurs fois
    Bonjours a tous

    Voila je suis débutant en python et j'ai un problème

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

    Je voudrais donc que la fenêtre2 ne puisse s'ouvrir qu'une seul fois.

    Merci de votre attention.

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

    Je voudrais donc que la fenêtre2 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 déclenche l'ouverture de fenetre2?
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2014
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    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 fenêtre ame
    Fenetre3 ()


    Voila les bout du code en relation avec le problème et je souhaite que la fenêtre3 ne puisse s’ouvrir qu'en un seul exemplaire.

  4. #4
    Membre régulier Avatar de psyphi
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2006
    Messages : 119
    Points : 120
    Points
    120
    Par défaut
    vive la balise code pour poster des lignes de ton programme. C'est illisible autrement.
    Fenetre2 et Fenetre3 ce sont des fonctions ou des méthodes d'une classe?
    Mon blog: http://blog.bores.fr
    Mon wiki: http://bores.fr/wiki
    Mes programmes libres: https://github.com/tbores

  5. #5
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2014
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    #Interface Graphique

    #_________________________________IMPORTATION___________________________________
    from time import *
    from tkinter import *
    from Projet_fonction import *

    #_________________________________DEBUT_FENETRE_________________________________

    F1=Tk()
    F1.title("PROJET ISN")
    F1.geometry ('700x700+200+10')
    F1.minsize (700,700)
    F1.maxsize (700,700)
    #_______________________________IMAGE___________________________________________

    Fond_1= PhotoImage (file='Fond_1.gif')
    #_______________________________CREATION_DU_FOND_DE_DEPART______________________

    fond=Canvas(F1,width=700, height=700)
    Accueil_Fond=fond.create_image(350,350,image=Fond_1)
    fond.pack()
    #________________________________CREATION_DE_LA_FENETRE_DE_JEUX_________________
    def Choisir (event):
    if 250<=(event.x)<=500 and 200<=(event.y)<=400:
    Fenetre2()
    if 0<=(event.x)<=100 and 550<=(event.y)<=650:
    F1.destroy()

    #______________________________FENETRE_2________________________________________


    def Fenetre2():
    global L1
    F1.destroy ()
    F2=Tk()
    L1= Label(F2, text="Nombre de Cookie:",fg="brown",font=("Impact", 16),relief=RAISED,bg="grey")
    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(350,350,image=Fond_2)
    fond2.pack()
    fond2.bind ('<Button-1>', clique2)
    F2.mainloop ()

    #______________________________Clique_Sur_Page_Des_Ame__________________________

    def clique3 (event):
    if 0<=(event.x)<=100 and 0<=(event.y)<=100: #Amélioration 1
    Ame1 ()
    # if 100<=(event.x)<=600 and 160<=(event.y)<=260: #Amélioration 2
    # h ()
    # if 100<=(event.x)<=600 and 300<=(event.y)<=400: #Amélioration 3
    # h ()
    # if 100<=(event.x)<=600 and 440<=(event.y)<=540: #Amélioration 4
    # h ()
    # if 100<=(event.x)<=600 and 580<=(event.y)<=680: #Amélioration 5
    # h ()

    #_______________________________FENETRE_3_______________________________________

    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 ()
    #______________________________Clique___________________________________________
    def clique2 (event):
    if 300<=(event.x)<=400 and 300<=(event.y)<=400:
    cliquecookie ()
    if 100<=(event.x)<=200 and 100<=(event.y)<=200: #ouverture de la fenêtre ame
    Fenetre3 ()
    #___________________________________Clique Cookie_______________________________
    def cliquecookie():
    global Cookie, CookieTotal,L1
    CookieTotal=CookieTotal+Cookie
    L1.configure (text="Nombre de Cookie: " + str (CookieTotal))

    #______________________________AMELIORATION_COOKIE______________________________

    def Ame1():
    global CookieTotal,PrixAme1,NbrAme1,PrixAme1BASE
    if CookieTotal>=PrixAme1 and CookieTotal-PrixAme1>0:
    NbrAme1=NbrAme1+1
    print(NbrAme1)
    print (PrixAme1)
    PrixAme1=PrixAme1BASE+(NbrAme1*5)
    CookieAme1Total=(NbrAme1*CookieAme1)
    CookieTotal=CookieTotal-PrixAme1

    #def Ame2():
    #global CookieTotal

    #_________________________FIN_BOUCLE_FENETR_____________________________________
    fond.bind ('<Button-1>',Choisir)
    F1.geometry('400x400')
    F1.mainloop()



    Voila le code avec la balise et oui les fenêtre sont des fonctions.

  6. #6
    Membre régulier Avatar de psyphi
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2006
    Messages : 119
    Points : 120
    Points
    120
    Par défaut
    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 réouvrir ta fenêtre tu dois vérifier l'état de cette variable.
    Cependant je pense que ton code n'est pas très propre, pourquoi ta fenêtre F1 est globale et pas les autres. Normalement ne devrais tu pas n'avoir une fenêtre principale qui lance la mainloop et gère les autres fenetres.
    Mon blog: http://blog.bores.fr
    Mon wiki: http://bores.fr/wiki
    Mes programmes libres: https://github.com/tbores

  7. #7
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2014
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Merci pour ton aide par rapport au fenêtre je vais des a présent la mettre en pratique !

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

  8. #8
    Membre régulier Avatar de psyphi
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2006
    Messages : 119
    Points : 120
    Points
    120
    Par défaut
    Mais pour la variable global qui fait true ou false par rapport a l'ouverture de la fenêtre, si la personne ferme la fenêtre avec la croix de windows ma variable global ne pourra pas changer d'état et donc la fenêtre ne pourra plus être ouverte a nouveau.
    Je ne suis pas un expert de Tkinter, mais je suis certain que la fenêtre envoie un événement quand elle est fermée par l'utilisateur et que tu dois pouvoir récupérer cet événement dans ton code pour mettre la variable global à False.
    Mon blog: http://blog.bores.fr
    Mon wiki: http://bores.fr/wiki
    Mes programmes libres: https://github.com/tbores

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

    Je dirais hu?!?
    Techniquement, ce que vous faites avec .bind pourra se défaire avec .unbind.
    Apres il faut lire la notice pour apprendre que .bind retourne un identifiant qui pourra être passe a .unbind
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> import tkinter as tk
    >>> def callback(event):
    ...     print('callback')
    ...
    >>> w.pack()
    >>> w.bind('<Button-1>', callback)
    '35835080callback'
    >>> cb = '35835080callback'
    Lorsqu'on clique "dans" la fenêtre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> callback
    callback
    callback
    Puis on désarme le callback:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> help(w.unbind)
    Help on method unbind in module tkinter:
     
    unbind(self, sequence, funcid=None) method of tkinter.Canvas instance
        Unbind for this widget for event SEQUENCE  the
        function identified with FUNCID.
     
    >>> w.unbind('<Button-1>', cb)
    >>>
    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
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2014
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Merci je vais dés a présent mettre en pratique ce que vous m'avez dit ! Et reposter un message si je ne parviens pas a la faire fonctionner

  11. #11
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2014
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    J'ai continuer a chercher et trouver la fonction nomdefenetre.protocole(("WM_DELETE_WINDOW", fonction booléene)

    ceci permet de récupérer le fait que l'utilisateur ferme la fenêtre avec la croix de windows voila

Discussions similaires

  1. Réponses: 3
    Dernier message: 28/07/2014, 09h37
  2. [WD17] empêcher l'ouverture d'une même fenêtre deux fois
    Par alex1005 dans le forum WinDev
    Réponses: 3
    Dernier message: 13/01/2014, 09h55
  3. Plusieurs GUI dans une même fenêtre
    Par z_tweety dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 14/05/2010, 11h17
  4. ouverture d'une meme application plusieurs fois
    Par warubi dans le forum VB.NET
    Réponses: 4
    Dernier message: 29/06/2007, 18h50
  5. Ouverture de la même JFrame plusieurs fois
    Par louby dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 08/06/2006, 17h23

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