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 :

Integration d'un menu deroulant. MAIS DANS UNE CLASSE


Sujet :

Tkinter Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 76
    Points : 48
    Points
    48
    Par défaut Integration d'un menu deroulant. MAIS DANS UNE CLASSE
    Bonjour,

    ce post ne fait pas doublon avec le précédent (qques posts plus bas). Je travaille à partir d'une classe.

    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
     
    def widget_menu_test_01(self):
    		# Frame qui vient se superposer a la Frame de presentation
    		self.widget_menu_test_01_frm= Tkinter.Frame(self.widget_menu_presentation_frm, width= 700, height= 500, bg= "gray")
    		self.widget_menu_test_01_frm.grid_propagate(0)
    		self.widget_menu_test_01_frm.grid(row= 0, column= 0)
     
    		# > Label explicatif
    		self.widget_menu_test_01_explik_lbl= Tkinter.Label(self.widget_menu_test_01_frm, text= "Un menu de base")
    		self.widget_menu_test_01_explik_lbl.grid(row= 0, column= 0, padx= 5, pady= 5)
     
    		# > creation et ajout du widget Menu
    		# creation de la barre de menu
    		self.main_menu= Tkinter.Menu(self.widget_menu_test_01_frm)
    		# creation des fonctions specifiques au Menu
    		def Affiche(self):
    			pass
    			#Tkinter.MessageBox.showinfo("exemple d'un menu Tkinter")
     
    		def About(self):
    			pass
    			#Tkinter.MessageBox.showinfo("A propos: version XXX")
     
    		# creation du menu_fils_01
    		self.menu_fils_01= Tkinter.Menu(self.main_menu)
    		# constitution du menu_fils_01
    		self.menu_fils_01.add_command(label= "Afficher", command= Affiche)
    		self.menu_fils_01.add_command(label= "Quitter", command= self.widget_menu_test_01_frm.destroy)
    		# creation du menu_fils_02
    		self.menu_fils_02= Tkinter.Menu(self.main_menu)
    		#constitution du menu_fils_02
    		self.menu_fils_02.add_command(label="A propos", command= About)
    		# constitution de la barre de manu (main_menu)
    		self.main_menu.add_cascade(label= "Exemple", menu= self.menu_fils_01)
    		self.main_menu.add_cascade(label= "A propos", menu= self.menu_fils_02)
     
    		# on config la barre de menu (main_menu) a la fenetre
    		self.widget_menu_test_01_frm.config(menu= self.main_menu)
    Je vous explique.
    + haut, la methode que j'appelle grâce a un bouton et qui me définit une Frame, un Label et un Menu.

    Le problème est à la dernière ligne puisque lorsque je lance le fichier, je fais apparaitre ma Frame et là Python me signale que l'option -menu est inconnue de Frame.
    J'ai essayé avec pack et grid, ça n'est pas possible et les exemples de la Faq ou autres sites, ne donnent rien sur le travail a partir de classes.

    Est ce possible d'avoir la solution svp.
    En vous remerciant
    areuh

    [edit]
    la Frame apparait ds une Toplevel mais qd je modifie les lignes adéquates, je n'ai plus l'erreur -menu mais le Menu n'apparait pas.
    [/edit]

  2. #2
    Membre averti
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Mai 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 290
    Points : 388
    Points
    388
    Par défaut
    Bonjour,
    Ce n'est pas ta Frame qui a un menu, mais ta fenetre (ton Toplevel).
    En reprenant ton 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
    import Tkinter
     
    class appli:
        def __init__(self):
            self.root=Tkinter.Tk()
            self.widget_menu_presentation_frm=Tkinter.Frame(self.root)
            self.widget_menu_presentation_frm.pack()
            Tkinter.Button(self.widget_menu_presentation_frm,text='clik',command=self.widget_menu_test_01).pack()
            self.root.mainloop()
        def widget_menu_test_01(self):
            # Frame qui vient se superposer a la Frame de presentation
            self.widget_menu_test_01_frm= Tkinter.Frame(self.widget_menu_presentation_frm, width= 700, height= 500, bg= "gray")
            self.widget_menu_test_01_frm.grid_propagate(0)
            self.widget_menu_test_01_frm.grid(row= 0, column= 0)
            # > Label explicatif
            self.widget_menu_test_01_explik_lbl= Tkinter.Label(self.widget_menu_test_01_frm, text= "Un menu de base")
            self.widget_menu_test_01_explik_lbl.grid(row= 0, column= 0, padx= 5, pady= 5)
            # > creation et ajout du widget Menu
            # creation de la barre de menu
            self.main_menu= Tkinter.Menu(self.root)
            # creation des fonctions specifiques au Menu
            def Affiche():
                pass
                #Tkinter.MessageBox.showinfo("exemple d'un menu Tkinter")
            def About():
                pass
                #Tkinter.MessageBox.showinfo("A propos: version XXX")
            # creation du menu_fils_01
            self.menu_fils_01= Tkinter.Menu(self.main_menu)
            # constitution du menu_fils_01
            self.menu_fils_01.add_command(label= "Afficher", command= Affiche)
            self.menu_fils_01.add_command(label= "Quitter", command= self.widget_menu_test_01_frm.destroy)
            # creation du menu_fils_02
            self.menu_fils_02= Tkinter.Menu(self.main_menu)
            #constitution du menu_fils_02
            self.menu_fils_02.add_command(label="A propos", command= About)
            # constitution de la barre de manu (main_menu)
            self.main_menu.add_cascade(label= "Exemple", menu= self.menu_fils_01)
            self.main_menu.add_cascade(label= "A propos", menu= self.menu_fils_02)
     
            # on config la barre de menu (main_menu) a la fenetre
            self.root.config(menu= self.main_menu)
    if __name__=='__main__':
        app=appli()
    En passant, tu devrais faire :
    C'est plus rapide à taper par la suite

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 76
    Points : 48
    Points
    48
    Par défaut
    Salut tout le monde

    Pierjean,

    ton code,
    apres copie collé ds un fichier .py, ajout des () à la derniere ligne (sinon ça fait rien du tout).
    Ton code... il m'affiche une toute petite fentre avec un bouton "click". Alors je clique... normal quoi et là j'ai ma Toplevel avec ma Frame qui contient bien mon Label mais toujours pas de Menu.

    Sans méchanceté, t'as testé chez toi, ça marche???

    Je continuerai tout à l'heure, je dois sortir.
    a+
    areuh

  4. #4
    Membre averti
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Mai 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 290
    Points : 388
    Points
    388
    Par défaut
    Je viens de tester, j'ai d'abord une fenêtre, et quand je clique sur le bouton,
    la fenêtre s'agrandit pour contenir la frame avec le label, avec un menu (exemple et apropos).
    PS : les parenthèses sont là. Erreur de copier/coller.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 76
    Points : 48
    Points
    48
    Par défaut
    Salut tlmd,

    Pierjean:
    oui ça fonctionne, aussi bien avec ton exemple que lorsque je rattache à la Toplevel. En fait en tant que tres recent mac user, je cherchais le menu sur la Toplevel (comme ça devrait etre le cas sous windows) et pas la barre de menu mac en haut du moniteur. Vraiment désolé.

    2 petites questions concernant le code et je mets un RESOLU:

    la 1°)
    - pourquoi ne faut il pas ecrire le fameux "self" en argument dans la definition des methodes Affiche et About
    Voilà l'erreur que je me tape quand je les écris:
    AttributeError: Gui instance has no attribute 'Affiche'
    la 2°)
    - j'ai bien mes tkMessageBox qui apparraissent mais le texte qui apparait dans ces dernieres ne correspond pas du tout à ce que j'ai définit. En fait qque soit la tkMessageBox, le texte est: 0^.

    Saurais tu d'ou ça vient?
    encore merci pour les réponses.
    a+
    areuh

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 76
    Points : 48
    Points
    48
    Par défaut
    Salut,

    Bon en ce qui concerne la 2°) question, il faut mettre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tkMessageBox.showinfo(message= "bla bla bla")
    par contre si je rajoute avec title j'ai aucun titre. Enfin pas grave.

    Il manque qd meme le pourquoi du comment à la 1°) question c'est celle qui me chagrine le plus, dc si vous abez une réponse.

    Merci
    a+
    areuh

  7. #7
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    soit tu fais comme tu as fait.

    Le mieux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            def Affiche(self):
                pass
     
    ...
             self.menu_fils_01.add_command(label= "Afficher", command= self.Affiche)

  8. #8
    Membre averti
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Mai 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 290
    Points : 388
    Points
    388
    Par défaut
    Bonjour,
    Regarde l'indentation : Ce sont des sous fonctions de "widget_menu_test_01()".
    Sinon :
    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
    import Tkinter
     
    class appli:
        def __init__(self):
            self.root=Tkinter.Tk()
            self.widget_menu_presentation_frm=Tkinter.Frame(self.root)
            self.widget_menu_presentation_frm.pack()
            Tkinter.Button(self.widget_menu_presentation_frm,text='clik',command=self.widget_menu_test_01).pack()
            self.root.mainloop()
        def widget_menu_test_01(self):
            # Frame qui vient se superposer a la Frame de presentation
            self.widget_menu_test_01_frm= Tkinter.Frame(self.widget_menu_presentation_frm, width= 700, height= 500, bg= "gray")
            self.widget_menu_test_01_frm.grid_propagate(0)
            self.widget_menu_test_01_frm.grid(row= 0, column= 0)
            # > Label explicatif
            self.widget_menu_test_01_explik_lbl= Tkinter.Label(self.widget_menu_test_01_frm, text= "Un menu de base")
            self.widget_menu_test_01_explik_lbl.grid(row= 0, column= 0, padx= 5, pady= 5)
            # > creation et ajout du widget Menu
            # creation de la barre de menu
            self.main_menu= Tkinter.Menu(self.root)
            # creation du menu_fils_01
            self.menu_fils_01= Tkinter.Menu(self.main_menu)
            # constitution du menu_fils_01
            self.menu_fils_01.add_command(label= "Afficher", command= self.Affiche)
            #~ self.menu_fils_01.add_command(label= "Quitter", command= self.widget_menu_test_01_frm.destroy)
            self.menu_fils_01.add_command(label= "Quitter", command= self.onQuit)
            # creation du menu_fils_02
            self.menu_fils_02= Tkinter.Menu(self.main_menu)
            #constitution du menu_fils_02
            self.menu_fils_02.add_command(label="A propos", command= self.About)
            # constitution de la barre de manu (main_menu)
            self.main_menu.add_cascade(label= "Exemple", menu= self.menu_fils_01)
            self.main_menu.add_cascade(label= "A propos", menu= self.menu_fils_02)
     
            # on config la barre de menu (main_menu) a la fenetre
            self.root.config(menu= self.main_menu)
            # creation des fonctions specifiques au Menu
        def Affiche(self):
                pass
                #Tkinter.MessageBox.showinfo("exemple d'un menu Tkinter")
        def About(self):
                pass
                #Tkinter.MessageBox.showinfo("A propos: version XXX")
        def onQuit(self):
     
            self.widget_menu_test_01_frm.destroy()
            self.root.config(menu=None)
    if __name__=='__main__':
        app=appli()

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 76
    Points : 48
    Points
    48
    Par défaut
    Salut,

    oui ok, j'avais completement zappé l'indentation.

    Merci à vous 2 d'avoir apporté la précision, c'est le genre d'erreur que tu cherches pendant des jours.

    je mets un petit Resolu, merci encore
    a+
    areuh

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

Discussions similaires

  1. menu déroulant combobox dans une userform
    Par NicolasMO dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 25/07/2007, 18h44
  2. [Conception] Menu deroulant à partir d'une table volumineuse
    Par newbycool dans le forum Modélisation
    Réponses: 15
    Dernier message: 20/04/2007, 11h26
  3. Réponses: 1
    Dernier message: 15/08/2005, 19h38
  4. Réponses: 2
    Dernier message: 27/04/2005, 08h56
  5. [applet] lancer une applet mais dans une page web
    Par dzincou dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 11/08/2004, 13h32

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