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 :

Toplevel <FocusOut>, et bouton OpenTopLevel


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Mai 2012
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2012
    Messages : 70
    Par défaut Toplevel <FocusOut>, et bouton OpenTopLevel
    Bonjour à tous,

    J'ai ci-dessous un bout de code qui permet l'ouverture d'une toplevel via un bouton.
    Lorsque le Focus est perdu par la toplevel, cette dernière est détruite.

    Mon problème est que lorsque j'appuie deux fois de suite sur le bouton, la toplevel se recréé automatiquement.

    Est-il possible de fermer la toplevel lors du deuxième appui bouton.

    Merci pour vos réponses


    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
     
    def main():
     
        def showtoplevel():
            toplevel=Tk.Toplevel()
            toplevel.overrideredirect(1)
            toplevel.transient()
            toplevel.bind('<FocusOut>', lambda widget: closetoplevel(toplevel))
            listbox=Tk.Listbox(toplevel)
            listbox.grid()
            listbox.focus()
        def closetoplevel(widget):
            widget.destroy()
     
        root=Tk.Tk()
        Tk.Entry(root).grid(row=0, column=0)
        Tk.Button(root, command=showtoplevel).grid(row=0, column=1)
     
        root.mainloop()
     
    if __name__ == '__main__':
        try:
            import Tkinter as Tk
        except:
            import tkinter as Tk
        main()

  2. #2
    Membre averti
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Mai 2012
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2012
    Messages : 70
    Par défaut Résolu
    Résolu
    Si ça peut aider voici ma soluce

    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
     
    #!/usr/bin/env python
    # -*- coding:UTF-8 -*-
     
    def main():
        def active_button():
            button.config(state=Tk.NORMAL, text='ouvrir')
     
        def showtoplevel():
            toplevel=Tk.Toplevel()
            toplevel.overrideredirect(1)
            toplevel.transient()
            toplevel.bind('<FocusOut>', lambda widget: closetoplevel(toplevel))
            button.config(state=Tk.DISABLED, text='fermer')
            listbox=Tk.Listbox(toplevel)
            listbox.grid()
            listbox.focus()
     
        def closetoplevel(widget):
            widget.destroy()
            button.after(1, active_button)
     
        root=Tk.Tk()
        Tk.Entry(root).grid(row=0, column=0)
        button=Tk.Button(root, command=showtoplevel, text='ouvrir')
        button.grid(row=0, column=1)
     
        root.mainloop()
     
    if __name__ == '__main__':
        try:
            import Tkinter as Tk
        except:
            import tkinter as Tk
        main()

  3. #3
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour MzBouba,

    Deux autres approches:

    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
    def main():
     
        def showtoplevel():
            for widget in root.winfo_children():
                if isinstance(widget, Tk.Toplevel):
                    return
            toplevel = Tk.Toplevel(root)
            toplevel.withdraw()
            toplevel.bind('<FocusOut>', closetoplevel)
            listbox = Tk.Listbox(toplevel)
            listbox.grid()
            listbox.focus()
            toplevel.overrideredirect(1)
            toplevel.transient()
            toplevel.deiconify()
     
        def closetoplevel(event):
            toplevel.destroy()
     
        root = Tk.Tk()
        Tk.Entry(root).grid(row=0, column=0)
        Tk.Button(root, command=showtoplevel).grid(row=0, column=1)
        root.mainloop()
     
     
    if __name__ == '__main__':
        try:
            import Tkinter as Tk
        except:
            import tkinter as Tk
        main()
    (Si l'on considère que le Toplevel est unique)

    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
    def main():
        def showtoplevel():
            if root.top:
                return
            toplevel = Tk.Toplevel(root)
            root.top = toplevel
            toplevel.withdraw()
            toplevel.bind('<FocusOut>', closetoplevel)
            listbox = Tk.Listbox(toplevel)
            listbox.grid()
            listbox.focus()
            toplevel.overrideredirect(1)
            toplevel.transient()
            toplevel.deiconify()
     
        def closetoplevel(event):
            root.top = None
            toplevel.destroy()
     
        root = Tk.Tk()
        root.top = None
        Tk.Entry(root).grid(row=0, column=0)
        Tk.Button(root, command=showtoplevel).grid(row=0, column=1)
        root.mainloop()
     
     
    if __name__ == '__main__':
        try:
            import Tkinter as Tk
        except:
            import tkinter as Tk
        main()
    (Qu'importe la boite ici)

    @+

  4. #4
    Membre averti
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Mai 2012
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2012
    Messages : 70
    Par défaut
    Bonjour PauseKawa,

    Merci d'avoir pris le temps de répondre.

    Après test de tes codes, j'en suis toujours à avoir une réouverture de la TopLevel après un deuxième clique <Button-1> sur le bouton.
    Logique après tout car la toplevel('<FocusOut>') ferme automatiquement la Toplevel, avant le clique sur le bouton qui la ré ouvre de suite.

    La seule soluce (et c'est pas faute d'avoir chercher !!) que j'ai trouvé est donc de <DISABLED> le bouton pour le remettre à son état normal après une tempo.

  5. #5
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Citation Envoyé par MzBouba Voir le message
    Après test de tes codes, j'en suis toujours à avoir une réouverture de la TopLevel après un deuxième clique <Button-1> sur le bouton.
    ?
    Alors je n'ai pas compris la question.
    J'ai ci-dessous un bout de code qui permet l'ouverture d'une toplevel via un bouton.
    Lorsque le Focus est perdu par la toplevel, cette dernière est détruite.

    Mon problème est que lorsque j'appuie deux fois de suite sur le bouton, la toplevel se recréé automatiquement.

    Est-il possible de fermer la toplevel lors du deuxième appui bouton.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    button.after(1, lambda: button.config(state=Tk.NORMAL, text='ouvrir'))
    N’empêche en rien la réouverture d'un Toplevel après 1 ms.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        def showtoplevel():
            for widget in root.winfo_children():
                if isinstance(widget, Tk.Toplevel):
                    return
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        def showtoplevel():
            if root.top:
                return
    Par contre oui.

    @+

  6. #6
    Membre averti
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Mai 2012
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2012
    Messages : 70
    Par défaut
    Autant pour moi, j'ai du mal m'exprimer.

    En fait le but de ce code était de parvenir à avoir le même effet qu'une combobox.

    Le premier clique bouton, ouvre la toplevel.
    Le deuxième la détruit/ferme.

    De plus, il faut qu'un click (listbox inclus),détruise la toplevel.
    D'où mon toplevel.bind('<FocusOut>') qui permettait de simuler cette évènement.

    (Je comprend mieux l'utilisation de votre code qui empêche, bien la réouverture d'une deuxième toplevel)

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

Discussions similaires

  1. Pop-up d'une dialog box a partir d'un bouton
    Par bobbyjack dans le forum MFC
    Réponses: 21
    Dernier message: 13/09/2005, 15h32
  2. redémarrer un prog à partir d'un bouton
    Par yokito dans le forum Langage
    Réponses: 5
    Dernier message: 06/09/2002, 13h19
  3. Réponses: 2
    Dernier message: 31/08/2002, 14h00
  4. Bmp pour boutons
    Par Fizgig dans le forum Outils
    Réponses: 5
    Dernier message: 22/08/2002, 10h56
  5. Afficher/Masquer un bouton comme IE 6
    Par benj63 dans le forum C++Builder
    Réponses: 3
    Dernier message: 29/07/2002, 13h12

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