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 :

[Résolu] Problème de débutante : Champ entry et bouton OK


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2013
    Messages : 5
    Par défaut [Résolu] Problème de débutante : Champ entry et bouton OK
    Bonjour,

    Je suis pour un projet étudiant en train de travailler sur un programme (en occurrence, sur un bout de programme), dans lequel l'utilisateur doit pouvoir renseigner des "fiches" pour des animaux, et des aliments.
    Je travaille sur la partie du programme qui doit vérifier qu'une fiche n'est pas déjà existante. En python pur et dur, tout va bien. C'est quand j'essaye de faire la même chose dans tkinter que rien ne va.

    J'ai mis une case "entry", puis un bouton OK qui est censé envoyer ce qui a été écrit dans la case vers une fonction qui vérifie si le fichier correspondant existe ou pas. Mon problème est que le programme ne me laisse pas le temps de remplir cette case entry, qu'il est déjà passé à la fonction de test sans que j'aie appuyé sur le bouton ...

    Bref, la réponse est peut être sous mon nez, mais comme je débute, je suis un peu perdue avec tkinter ... des idées ?
    Je travaille sous python 3.3.2

    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
    from tkinter import *
    
    # fonction qui teste l'existence d'un fichier
        def fich_existe(genre, nom, gui):
            fname = genre+"_"+(str(nom)).lower()+".txt"
            print(fname)# test
    
            try:
                f = open(fname,'r')
                f.close()
                exist = "TRUE"
            except:
                exist = "FALSE"
    
            print(exist) #test
            return exist
    
    class verif_nom_fiche(object):
                  
        def __init__(self, genre):
            self.root = Tk()
            self.root.title("Création d'une nouvelle fiche "+ genre)
            nom = StringVar
            texte = Label(self.root, text="Quel est le nom du "+genre).pack(pady=10)
       
            nom_ent = Entry (self.root, textvariable=nom).pack()
            nom_ok = Button(self.root, text="OK", command = fich_existe(genre, nom_ent.get(), self.root)).pack()
            ann = Button (self.root, text="Annuler", command = self.root.quit).pack()
            
    
            self.root.mainloop()
            self.root.destroy() # destruction (fermeture) de la fenêtre
    
    app = verif_nom_fiche("cheval")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        nom_ok = Button(self.root, text="OK", command = fich_existe(genre, nom_ent.get(), self.root)).pack()
    AttributeError: 'NoneType' object has no attribute 'get'
    J'y ai passé la journée, ai épluché plein de tutos, mais n'ai pas trouvé la solution à mon problème ... Quelqu'un pour aider une demoiselle en détresse ? Merci d'avance !

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Il y a plusieurs problèmes

    1) On ne peut pas appeler directement une fonction avec arguments de cette façon avec votre widget Button. Pour être simple dans ce cas de figure, vous appelez la fonction avant de créer le widget et du coup on Tkinter ignore la valeur de retour de la fonction.

    Voir la façon de faire avec les lambdas functions

    2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.root.destroy() # destruction (fermeture) de la fenêtre
    est une problématique dans le sens où à peine vous ouvrez votre fenêtre que vous demandez de la fermer. Une bonne raison comme l'appui d'un bouton, la détection de votre valeur d'entrée (widget entry) ou autres pourraient le permettre, mais pas sans...

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,
    L'instruction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            nom_ent = Entry (self.root, textvariable=nom).pack()
    assigne a /nom_ent/ le retour de l'appel a .pack() => None
    C'est ce qui fait raler l'instruction suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      nom_ok = Button(self.root, text="OK", command = fich_existe(genre, nom_ent.get(), self.root)).pack()
    Préférez écrire cela en 2 lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            nom_ent = Entry (self.root, textvariable=nom)
                       nom_ent.pack()
    Il y a pleins d'autres petites coquilles dans votre code.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    3) Le message d'erreur indique que nom_ent est None
    ceci très probablement parce que la méthode pack() retourne None.
    Donc il faut l'écrire en deux lignes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    nom_ent = Entry (self.root, textvariable=nom)
    nom_ent.pack()
    4) verif_nom_fiche n'a pas de raison d'être une classe mais une fonction.
    Par contre l'interface peut être une classe, elle.

  5. #5
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2013
    Messages : 5
    Par défaut
    Merci pour la rapidité de vos réponses !

    J'ai réessayé en appliquant vos recommandations (est ce que j'en ai oublié ?)
    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 fich_existe(genre, nom):
        fname = genre+"_"+(str(nom)).lower()+".txt"
        print(fname)# test
     
        try:
            f = open(fname,'r')
            f.close()
            exist = "TRUE"
        except:
            exist = "FALSE"
     
        print(exist)
        return exist
     
    class verif_nom_fiche(object):
     
        def __init__(self, genre):
            self.root = Tk()
            self.root.title("Création d'une nouvelle fiche "+ genre)
            nom = StringVar
            texte = Label(self.root, text="Quel est le nom du "+genre).pack(pady=10)
     
            nom_ent = Entry (self.root, textvariable=nom)
            nom_ent.pack()
            nom_ok = Button(self.root, text="OK", command = fich_existe(genre, nom))
            nom_ok.pack()
            ann = Button (self.root, text="Annuler", command = self.root.quit)
            ann.pack()
     
            self.root.mainloop()
     
    app = verif_nom_fiche("cheval")
    et pareil, ca ne marche pas : la boite de dialogue apparait, pas de problème, mais ceci s'affiche dans python :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cheval_<class 'tkinter.stringvar'>.txt # donc mon "nom" est encore vide
    FALSE # le fichier n'existe pas
    et quand j'essaye de remplir quand même la case, et je j'appuie sur OK, rien ne se passe :/

    VinsS : comment est ce que je peux transformer cette classe en fonction ?

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Je vous ai pourtant donner le lien en rapport avec les lambdas function...

  7. #7
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2013
    Messages : 5
    Par défaut
    Oui effectivement, je m'en suis rendue compte après avoir envoyé mon message !
    En fait j'ai lu le lien que vous m'avez envoyé, fais d'autres recherches pour avoir d'autres exemples ... bon, je suis à peu près sure que toutes les subtilités des fonctions lambdas m'échappent, mais j'ai essayé comme ceci :
    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 __init__(self, genre):
            self.root = Tk()
            self.root.title("Création d'une nouvelle fiche "+ genre)
            nom = StringVar
            texte = Label(self.root, text="Quel est le nom du "+genre).pack(pady=10)
     
            nom_ent = Entry (self.root, textvariable=nom)
            nom_ent.pack()
            nom_ok = Button(self.root, text="OK", command = lambda : fich_existe(genre, nom))
            nom_ok.pack()
            ann = Button (self.root, text="Annuler", command = self.root.quit)
            ann.pack()
     
            self.root.mainloop()
    Ce qui a effectivement provoqué un changement, étant donné que mon programme attend que je lui indique un nom .... hourra !
    par contre (c'aurait été trop beau ), il me renvoie le même message après avoir cliqué sur "ok" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cheval_<class 'tkinter.stringvar'>.txt # donc mon "nom" est encore vide
    En gros il ne prend pas en compte ce que j'écris avant de valider et là je dois bien avouer que je suis un peu perdue ...

  8. #8
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2013
    Messages : 5
    Par défaut
    Ca y est j'ai réussi ! j'avais juste oublié un "get"

    La fenetre s'affiche et attend le nom demandé
    quand j'appuie sur ok avec un nom qui n'existe pas, python renvoie le nom que j'ai écris (réponse de la ligne 5), le nom du fichier (réponse de la ligne 8) et false. En corrigeant et réappuyant sur ok, ca marche nikel !

    Merci pour votre aide !

    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
    from tkinter import *
     
    # fonction qui teste l'existence d'un fichier
    def fich_existe(genre, nom):
        print(nom)#test
     
        fname = genre+"_"+(str(nom)).lower()+".txt"
        print(fname)# test
     
        try:
            f = open(fname,'r')
            f.close()
            exist = "TRUE"
        except:
            exist = "FALSE"
     
        print(exist)#test
        return exist
     
    class verif_nom_fiche(object):
     
        def __init__(self, genre):
            self.root = Tk()
            self.root.title("Création d'une nouvelle fiche "+ genre)
            nom = StringVar
            texte = Label(self.root, text="Quel est le nom du "+genre).pack(pady=10)
     
            nom_ent = Entry (self.root, textvariable=nom)
            nom_ent.pack()
     
            nom_ok = Button(self.root, text="OK", command = lambda : fich_existe(genre, nom_ent.get()))
            nom_ok.pack()
            ann = Button (self.root, text="Annuler", command = self.root.destroy)
            ann.pack()
     
            self.root.mainloop()
     
    app = verif_nom_fiche("cheval")

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/08/2006, 17h01
  2. Problème avec les champs de type table
    Par devdev dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 16/12/2004, 16h05
  3. [Oracle][Delphi 7] Problème type de champ
    Par tiennos dans le forum Bases de données
    Réponses: 3
    Dernier message: 16/07/2004, 10h17
  4. Problème avec un champ 'long'
    Par yannick dans le forum Débuter
    Réponses: 2
    Dernier message: 25/07/2003, 14h17

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