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 :

Plusieurs fenêtres avec TKinter


Sujet :

Tkinter Python

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 12
    Points : 6
    Points
    6
    Par défaut Plusieurs fenêtres avec TKinter
    Bonjour,

    Je réalise un petit programme avec interface graphique faite avec TKinter.
    A partir de la fenêtre principale, un click sur un bouton m'ouvre une nouvelle fenêtre dans laquelle je mets des entry. Le problème c'est que je n'arrive pas à utiliser ces entry. J'ai le message d'erreur suivant: NameError: global name 'mon_entry' is not defined.
    Pourtant j'ai bien vérifié le nom des entry et ils sont identiques... Quelle est l'astuce pour utiliser une entry d'une fenêtre secondaire?

    Je joins un exemple de code équivalent à ce que je fais mais mais très épuré

    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
    # -*- coding: iso-8859-1 -*- 
    import os, re, sys, Tix, fpformat
    from datetime import date
    from PIL import Image, ImageTk 
    import Tkinter as Tk
     
    def new():
    	newWindow=Tk.Toplevel()
    	newWindow.grab_set()
    	newWindow.focus_set()
    	newWindow.geometry("200x100")
    	newWindow.resizable(False,False)
    	newWindow.title("Nouvelle fenetre")
     
    	testEntry=Tk.Entry(newWindow, width=8, justify='right')
    	testEntry.pack()
     
    	buttonPrint=Tk.Button(newWindow,text="Afficher contenu de l'entry",command=afficher)
    	buttonPrint.pack()
     
    def afficher():
    	print testEntry.get()
     
    mainWindow=Tix.Tk()
    mainWindow.geometry("200x200")
    mainWindow.resizable(False,False)
    mainWindow.title("Fenetre principale")
     
    buttonNouveau=Tk.Button(mainWindow,text="Nouveau lot",command=new)
    buttonNouveau.pack()
     
    mainWindow.mainloop()
    Merci d'avance...

  2. #2
    Membre confirmé
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Points : 618
    Points
    618
    Par défaut
    Bonjour,

    Si tu utilise Tix, utilise le jusqu'au bout.

    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
     
    import os, re, sys, Tix, fpformat
    from datetime import date
     
    def new():
    	newWindow=Tix.Toplevel()
    	newWindow.grab_set()
    	newWindow.focus_set()
    	newWindow.geometry("200x100")
    	newWindow.resizable(False,False)
    	newWindow.title("Nouvelle fenetre")
     
    	testEntry=Tix.Entry(newWindow, width=8, justify='right')
    	testEntry.pack()
     
    	buttonPrint=Tix.Button(newWindow,text="Afficher contenu de l'entry",command=afficher)
    	buttonPrint.pack()
     
    def afficher():
    	print testEntry.get()
     
    mainWindow=Tix.Tk()
    mainWindow.geometry("200x200")
    mainWindow.resizable(False,False)
    mainWindow.title("Fenetre principale")
     
    buttonNouveau=Tix.Button(mainWindow,text="Nouveau lot",command=new)
    buttonNouveau.pack()
     
    mainWindow.mainloop()

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    OK merci pour le conseil, mais ça ne semble pas résoudre le problème.
    Sinon je pensais que Tix appartenait au module Tk. C'est le cas ou pas du tout? C'est quoi la différence entre Tix et Tk?

    Merci

  4. #4
    Membre confirmé
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Points : 618
    Points
    618
    Par défaut
    le module Tix est une extention du module Tkinter

    Tk est la première fenetre que tu doit créer, ce n'est pas un module

    Il y à une Tkinter.Tk() et une Tix.Tk()

    les widgets Tix ne sont pas compatible avec les fenêtre Tkinter.Tk

    ça ne semble pas résoudre le problème
    Le bout de code que j'ai envoyé ne marche pas ?

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    OK merci pour les précisions.
    Sinon le code ne marche pas chez moi. J'utilise python V2.5.2, ça vient peut-être de là?

  6. #6
    Membre confirmé
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Points : 618
    Points
    618
    Par défaut
    1000 excuses, je suis allé un peu vite !

    lorsque tu déclare une variable dans une fonction, elle n'est visible que pour
    cette fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    def foo() :
        a = 1
     
    foo()
    print a # erreur.
    C'est la même chose pour "testEntry", il n'existe que dans new().

    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
     
    import os, re, sys, Tix, fpformat
    from datetime import date
    #from PIL import Image, ImageTk 
     
    def new():
            "creation d'une fenetre"
     
            def afficher():
                    "affiche l'Entry."
                    print testEntry.get()
     
            newWindow=Tix.Toplevel()
            newWindow.grab_set()
            newWindow.focus_set()
            newWindow.geometry("200x100")
            newWindow.resizable(False,False)
            newWindow.title("Nouvelle fenetre")
     
            testEntry = Tix.Entry( newWindow, width=8, justify='right' )
            testEntry.pack()
     
            buttonPrint=Tix.Button(newWindow,text="Afficher contenu de l'entry",command=afficher)
            buttonPrint.pack()
     
     
    mainWindow=Tix.Tk()
    mainWindow.geometry("200x200")
    mainWindow.resizable(False,False)
    mainWindow.title("Fenetre principale")
     
    buttonNouveau=Tix.Button(mainWindow,text="Nouveau lot",command=new)
    buttonNouveau.pack()
    Cette solution est assez moche et il serait préférable de la refaire en objet si tu touche un peu.

  7. #7
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Trés utile avec Tkinter : lambda

    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
    # -*- coding: iso-8859-1 -*- 
    from Tkinter import *
     
    def new():
        newWindow=Toplevel()
        newWindow.grab_set()
        newWindow.focus_set()
        newWindow.geometry("200x100")
        newWindow.resizable(False,False)
        newWindow.title("Nouvelle fenetre")
    
        testEntry=Entry(newWindow, width=8, justify='right')
        testEntry.pack()
    
        buttonPrint=Button(newWindow, text="Afficher contenu de l'entry", command = lambda: afficher(testEntry.get()))
        buttonPrint.pack()
     
    def afficher(a):
        print a
    	
    mainWindow=Tk()
    mainWindow.geometry("200x200")
    mainWindow.resizable(False,False)
    mainWindow.title("Fenetre principale")
     
    buttonNouveau=Button(mainWindow, text = "Nouveau lot", command = new)
    buttonNouveau.pack()
     
    mainWindow.mainloop()
    @+

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par vincent.mbg Voir le message
    1000 excuses, je suis allé un peu vite !

    lorsque tu déclare une variable dans une fonction, elle n'est visible que pour
    cette fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    def foo() :
        a = 1
     
    foo()
    print a # erreur.
    C'est la même chose pour "testEntry", il n'existe que dans new().

    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
     
    import os, re, sys, Tix, fpformat
    from datetime import date
    #from PIL import Image, ImageTk 
     
    def new():
            "creation d'une fenetre"
     
            def afficher():
                    "affiche l'Entry."
                    print testEntry.get()
     
            newWindow=Tix.Toplevel()
            newWindow.grab_set()
            newWindow.focus_set()
            newWindow.geometry("200x100")
            newWindow.resizable(False,False)
            newWindow.title("Nouvelle fenetre")
     
            testEntry = Tix.Entry( newWindow, width=8, justify='right' )
            testEntry.pack()
     
            buttonPrint=Tix.Button(newWindow,text="Afficher contenu de l'entry",command=afficher)
            buttonPrint.pack()
     
     
    mainWindow=Tix.Tk()
    mainWindow.geometry("200x200")
    mainWindow.resizable(False,False)
    mainWindow.title("Fenetre principale")
     
    buttonNouveau=Tix.Button(mainWindow,text="Nouveau lot",command=new)
    buttonNouveau.pack()
    Cette solution est assez moche et il serait préférable de la refaire en objet si tu touche un peu.
    Ouais pas très propre, mais je vais pas être trop exigent!
    Ca marche et c'est déjà ça ^^ Merci!
    Pour le code objet, il est possible de définir une classe contenant des entry et que cette classe soit appelée dans différentes fenêtres?

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par PauseKawa Voir le message
    Bonjour,

    Trés utile avec Tkinter : lambda

    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
    # -*- coding: iso-8859-1 -*- 
    from Tkinter import *
     
    def new():
        newWindow=Toplevel()
        newWindow.grab_set()
        newWindow.focus_set()
        newWindow.geometry("200x100")
        newWindow.resizable(False,False)
        newWindow.title("Nouvelle fenetre")
    
        testEntry=Entry(newWindow, width=8, justify='right')
        testEntry.pack()
    
        buttonPrint=Button(newWindow, text="Afficher contenu de l'entry", command = lambda: afficher(testEntry.get()))
        buttonPrint.pack()
     
    def afficher(a):
        print a
    	
    mainWindow=Tk()
    mainWindow.geometry("200x200")
    mainWindow.resizable(False,False)
    mainWindow.title("Fenetre principale")
     
    buttonNouveau=Button(mainWindow, text = "Nouveau lot", command = new)
    buttonNouveau.pack()
     
    mainWindow.mainloop()
    @+
    Ouais c'est bon à savoir, même si dans mon cas ça ne va pas être utilisable (le print était juste pour l'exemple, en fait je veux faire des insert et delete sur plusieurs entry)
    Merci pour ta contribution!

  10. #10
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Dans ce cas une closure est pas mal en effet.

    Maintenant si c'est juste pour garder la référence :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Mes_Globals():
        MonA = None
     
    class MonAppli(Tk):
     
       def UnTruc():
           Mes_Globals.MonA = 1
     
       def UnAutre():
            Print Mes_Globals.MonA
    Si c'est pour travailler sur une variable il est préférable de la récupérer en local bien sur.

    @+

    Petit edit : Attention toutefois avec le traitement des variables dans les closures.

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Merci à tous! Je passe le sujet en résolu ^^

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

Discussions similaires

  1. Gérer plusieurs fenêtres avec AWT
    Par The_GuiGui dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 09/04/2015, 20h51
  2. comment crée plusieurs fenêtres avec GLUT
    Par Haage dans le forum GLUT
    Réponses: 14
    Dernier message: 26/07/2007, 18h55
  3. [Outlook] ouverture plusieurs fenêtres avec même target
    Par seb_m dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 19/01/2007, 17h25
  4. [Tkinter] Plusieurs fenêtre avec Tkinter
    Par cyrpaut dans le forum Tkinter
    Réponses: 2
    Dernier message: 04/01/2006, 22h24
  5. Interface graphique avec plusieurs fenêtres
    Par Copps dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 30/03/2005, 18h00

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