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 :

[Tkinter] popups


Sujet :

Tkinter Python

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2006
    Messages : 80
    Par défaut [Tkinter] popups
    J'ai un petit probleme concernant Tkinter et les fenetre popups (cad des nouvelles fenetres qui s'ouvrent quand on clique sur un Button, par exemple)

    J'ai codé un barre de menu dans un Frame qui affiche plusierus choix (sous-menus). Chacun de ces sous-menus ouvre une nouvelle fenetre.

    Le probleme: a chaque fois qu'on clike dans le menu de la premiere fenetre, sans fermer les autres popups, on a une succession de fentre popups qui s'ouvrent...

    Comment indiquer dans le programme que quand je clike une options dans le menu, un popups s'ouvre ET tous les autres se ferment?

    J'espère avoir été plus ou moins clairs...

    Merci d'avance pour les réponses

  2. #2
    Membre confirmé

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2006
    Messages : 80
    Par défaut
    Oui, ta raison.
    Voila, je l'ai réduit au strict minimum.

    >quand on clique dans le menu déroulant sur une des options, un pop-up apparait. Je voudrais que quand on "oublie" de fermer un pop-up, et qu'on en ouvre un autre, il n'y ait qu'une seule fenetre d'ouverte a la fois

    bon là :S (j'arrive pas a m'expliquer). Aller voir vers la ligne 39, j'ai mis un comm.

    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
    #-*- coding:Utf-8 -*-
     
    from Tkinter import*
    class BarreDesMenus(Frame):
     def __init__(self, boss = None):
      Frame.__init__(self, borderwidth = 2)
     
      BoutonMenu1 = Menubutton(self, text =" Informations ") 
      BoutonMenu1.pack(side= RIGHT)
     
      menu1 = Menu(BoutonMenu1)
      menu1.add_command(label = "menu1", command = boss.commandmenu1) 
     
      menu1.add_command(label = "menu2", command = boss.commandmenu2)
     
      menu1.add_command(label = "menu3", command = boss.commandmenu3)
     
      BoutonMenu1.configure(menu = menu1)
     
    class Application(Frame):
     def __init__(self, boss = None):
     
      Frame.__init__(self)
     
      BarreMenus = BarreDesMenus(self) #FRAME 1
      BarreMenus.pack()
     
     #---------------------------  TOUTES LES COMMANDES AUXILIAIRES ---------------------------#
     
     def commandmenu1(self):
      fenetre_commandmenu1 = Tk()
      fenetre_commandmenu1.title("Menu1")
     
      #fenetre_commandmenu2.destroy  
      #fenetre_commandmenu3.destroy
     
      #je voulais mettre un truc pour eviter que il y ait toutes les fentre ouvertes en meme temps
     
     
      msg = Label(fenetre_commandmenu1, text="texte ici").grid(row = 1, column = 1)
     
      Bouttonretour = Button(fenetre_commandmenu1, text="   Retour   ", command = fenetre_commandmenu1.destroy).grid(row=2, column=1)
     
     def commandmenu2(self):
      fenetre_commandmenu2 = Tk()
      fenetre_commandmenu2.title("menu2")
     
      msg = Label(fenetre_commandmenu2, text="texte ici").grid(row = 1, column = 1)
     
      Bouttonretour = Button(fenetre_commandmenu2, text="   Retour   ", command = fenetre_commandmenu2.destroy).grid(row=2, column=1)
     
     
     def commandmenu3(self):
      fenetre_commandmenu3 = Tk()
      fenetre_commandmenu3.title("menu3")
     
      msg = Label(fenetre_commandmenu3, text="texte ici").grid(row = 1, column = 1)
     
      Bouttonretour = Button(fenetre_commandmenu3, text="   Retour   ", command = fenetre_commandmenu3.destroy).grid(row=2, column=1)
     
     
    appli = Application() 
    appli.mainloop()

  3. #3
    Membre éclairé
    Avatar de airod
    Homme Profil pro
    Gérant Associé, DMP Santé et Directeur technique
    Inscrit en
    Août 2004
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Gérant Associé, DMP Santé et Directeur technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 767
    Par défaut
    Bon, voilà comment j'ai procéder.....

    a toi d'adapter.
    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
    import Tkinter as tk
     
    class interface:
     
        def __init__(self):
     
            info1='info 1'
            info2='info 2'
            self.root=tk.Tk()
            self.root.title(' Fenetre principale ')
     
            Menu1=tk.Menubutton(self.root,text='Menu')
            Menu1.grid()
            menu1=tk.Menu(Menu1)
            menu1.add_command(label='sous menu 1',command=lambda message=info1 : self.info(message))
            menu1.add_command(label='sous menu 2',command=lambda message=info2 : self.info(message))
            Menu1.configure(menu=menu1)
     
            tk.Button(self.root,text='fermer',command=self.root.quit).grid()
     
            self.root.mainloop()
            self.root.destroy()
     
        def info(self,message):
            try:
                self.infos.quit()
                self.infos.destroy()
     
            except:
                pass
     
            self.infos=tk.Tk()
            tk.Label(self.infos,text=message).grid()
            tk.Button(self.infos,text='fermer',command=self.infos.quit).grid()
     
            self.infos.mainloop()
            self.infos.destroy()
     
     
    if __name__ == '__main__':
     
        app=interface()
    bon courage

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2006
    Messages : 80
    Par défaut
    Je sens que je vais en avoir besoin :s
    Je n'ai pas encore atteint ton niveau donc il y a pas mal de truc que je ne comprend pas bien...

    ############

    menu1.add_command(label='sous menu 1',command=lambda message="info1" : self.info(message))
    #je comprend pas bien les " : "
    et le "command=lambda" #c'est quoi comme commande?

    ############

    try:
    self.infos.quit()
    self.infos.destroy()
    except:
    pass
    #je devine ce que c'est mais peut m'expliquer (comme ca je peux le remettre dans une autre fonction )

    il y a encore la fonction quitter qui ne marche pas.

    ++

  5. #5
    Membre éclairé
    Avatar de airod
    Homme Profil pro
    Gérant Associé, DMP Santé et Directeur technique
    Inscrit en
    Août 2004
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Gérant Associé, DMP Santé et Directeur technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 767
    Par défaut
    alors, la fonction Lambda permet de passer des arguments a une fonction, là ou normalement ce n'est pas possible.

    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def mafonction(paramétre1,parametre2):
        print parametre1
        print parametre2
    si je veux atteindre ma fonction par l'action d'un clic sur un bouton je ferais normalement ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tk.Button(root,text='bouton',command=mafonction)
    hors tu n'as pas passé les paramètres a ta fonction donc Python te retourne une erreur. Si tu fait ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    parametre1='toto'
    parametre2='tata'
    tk.Button(root,text='bouton',command=mafonction(parametre1,parametre2))
    Là, python te retourne encore une erreur.

    La solution est d'utiliser l'instruction 'lambda', te permettant de passer les paramétres a ta fonction.
    ca donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    para1='toto'
     para2='tata'
     tk.Button(root,text='bouton',command=lambda parametre1=para1, parametre2=para2 : mafonction(parametre1,parametre2))
    Ca c'est fait!

    ensuite pour expliquer ma fonction (celle avec try)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     def info(self,message):
            try: >>>>>>>> j'essai de détruire self.infos si il existe
                self.infos.quit()
                self.infos.destroy()
     
            except:  >>>>>> si try retourne une erreur j'exécute ceci
                pass >>>>>> En fait rien je passe a la suite.
     
            self.infos=tk.Tk()  >>>>> Là, je construit self.infos
            tk.Label(self.infos,text=message).grid()
            tk.Button(self.infos,text='fermer',command=self.infos.quit).grid()
     
            self.infos.mainloop()
            self.infos.destroy()
    Comme self.infos fait partie des variables globales de ton appli, tu peux detruire celle ci si elle existe.

    ai je été assez clair?

  6. #6
    Membre confirmé

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2006
    Messages : 80
    Par défaut
    Super clair MERCI!!

    J'ai tout compris. En fait, le truc qui me manquais c'était le try et except. Parfait

    Merci de ton aide et de tes codes...

    (mtnt je vais aller poster un truc sur les frames :p)

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

Discussions similaires

  1. Comment créer un menu popup style XP ?
    Par chaours dans le forum Composants VCL
    Réponses: 4
    Dernier message: 29/09/2003, 09h38
  2. Popup avec un clic gauche
    Par Jéremy A dans le forum Composants VCL
    Réponses: 7
    Dernier message: 27/02/2003, 22h15
  3. Mettre un popup menu invisible ??
    Par Alberto dans le forum Composants VCL
    Réponses: 2
    Dernier message: 20/12/2002, 09h02
  4. Image popup d'une fiche à partir d'un TListImage
    Par FW-S dans le forum Composants VCL
    Réponses: 3
    Dernier message: 17/11/2002, 13h42

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