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éception des champs d'un formulaire avec .get()


Sujet :

Tkinter Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 17
    Points : 6
    Points
    6
    Par défaut Réception des champs d'un formulaire avec .get()
    Bonjour,
    J'ai un souci, et j'ai beau m'arracher les cheveux, je ne trouve pas la solution. Peut-être pourrez-vous m'aider.

    Tout d'abord, bonjour à tous. Je suis nouveau ici. Lycéen (en terminale), je débute en programmation Python, alors pardonnez-moi si je pose des questions naïves.
    J'ai un projet à rendre, et comme je disais, je coince sur un truc. Il s'agit d'une sorte de 'pronote' ou 'école directe' simplifiée : c'est à dire une interface de gestion des élèves et de leurs notes.

    J'ai créé un petit formulaire pour saisir quelques données : nom, prénom, profil (élève, prof, administratif)
    Un bouton valider envoie alors sur une fonction, appelée check()
    Dans cette fonction, je récupère les données du formulaire à l'aide d'un get(), et tout va bien.
    Ensuite, j'effectue quelques traitements, dont un test si le profil saisi est celui d'un élève, et dans ce cas, je crée un nouveau formulaire où je demande quelles sont les matières optionnelles (LV1, LV2 et Spécialité).
    Un nouveau bouton valider envoie alors vers la fonction save_mat()

    Et c'est là que ça coince : je veux récupérer les valeurs des champs saisis de la même manière que précédemment, mais j'obtiens un "name 'pso_lv1' is not defined" (pso_lv1 est le nom de l'un des champs saisis).
    Je ne comprends pas pourquoi le get() fonctionne la 1ère fois et pas la seconde.

    Je peux vous joindre le code, mais il est un peu long et je ne voulais pas surcharger le forum pour mon 1er post .

    Merci infiniment de votre aide !
    Th

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 313
    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 313
    Points : 36 819
    Points
    36 819
    Par défaut
    Salut,

    Commencez par poster le message d'erreur retourné par Python (plusieurs lignes).

    - W

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Commencez par poster le message d'erreur retourné par Python (plusieurs lignes).

    - W
    Voilà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.752.0_x64__qbz5n2kfra8p0\lib\tkinter\__init__.py", line 1883, in __call__
        return self.func(*args)
      File "c:\Users\xxx\Desktop\projet-python-isn\main_admin.py", line 73, in save_mat
        ch_lv1 = pso_lv1.get()
    NameError: name 'pso_lv1' is not defined
    Merci
    Th

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 313
    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 313
    Points : 36 819
    Points
    36 819
    Par défaut
    Salut,

    Python a toujours raison: la variable globale pso_lv1 n'est pas définie lorsqu'il essaie d'exécuter pso_lv1.get() dans le module main_admin.

    Où/Comment cette variable est-elle définie?

    - W

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Python a toujours raison: la variable globale pso_lv1 n'est pas définie lorsqu'il essaie d'exécuter pso_lv1.get() dans le module main_admin.

    Où/Comment cette variable est-elle définie?

    - W
    La variable pso_lv1 correspond à une entrée (combobox) dans mon formulaire :
    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
                txt_titre = tk.Label(fen_SaisiePerso, text="Saisie des matières optionnelles", fg='black')
                txt_lv1 = ttk.Label(fen_SaisiePerso, text="LV1", justify='left')
                pso_lv1 = tk.StringVar()
                pso_lv1 = ttk.Combobox(fen_SaisiePerso, values=dico_matieres['lv1'])
                txt_lv1.grid(row=1)
                pso_lv1.current(0)                      # Anglais par défaut
                pso_lv1.grid(row=1, column=1)
                txt_lv2 = ttk.Label(fen_SaisiePerso, text="LV2", justify='left')
                pso_lv2 = tk.StringVar()
                pso_lv2 = ttk.Combobox(fen_SaisiePerso, values=dico_matieres['lv2'])
                pso_lv2.current(1)                      # Espagnol par défaut
                txt_lv2.grid(row=1)
                pso_lv2.grid(row=2, column=1)
                txt_spe = ttk.Label(fen_SaisiePerso, text="Spécialité", justify='left')
                pso_spe = tk.StringVar()
                pso_spe = ttk.Combobox(fen_SaisiePerso, values=dico_matieres['spe'])
                txt_spe.grid(row=3)                     # Pas de spécialité par défaut
                pso_spe.grid(row=3, column=1)
                bt_valider = ttk.Button(fen_SaisiePerso, text='Valider', command=save_mat)
                bt_valider.grid(row=4)
                fen_SaisiePerso.mainloop()

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 313
    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 313
    Points : 36 819
    Points
    36 819
    Par défaut
    Salut,

    L'indentation du code me fait dire qu'il y a peu de chance pour que ce soit une variable "globale"...

    - W

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    L'indentation du code me fait dire qu'il y a peu de chance pour que ce soit une variable "globale"...

    - W
    OK, je crois avoir compris : j'ai déclaré les variables en tant que StringVar() plus en amont dans le code, non pas dans la fonction mais tout au début du code, dans ce qui appelle les fonctions, et je crois que ça a l'air de fonctionner.
    Il me reste d'autres bugs, mais je crois que celui-ci est résolu.
    Merci beaucoup !!
    Th

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Bon,
    Merci encore pour les indications précédentes, cela a effectivement retiré le message d'erreur.
    En revanche, je me suis avancé un peu vite, le bug n'est pas vraiment résolu : le champ est maintenant accepté en tant que tel, mais il est vide.
    La valeur censée être saisie dans la combobox n'est pas transmise.
    comment cela se fait-il ?
    Merci
    Th

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Je vais essayer de récapituler, parce que je ne sais pas si je suis clair :
    - le corps du programme appelle une fonction check()
    - cette fonction check() appelle une autre fonction save_mat()
    - cette fonction save-mat() est censée traiter des données saisies dans des champs (entry et combobox) définis dans la fonction check()

    Et c'est là que ça coince, les données saisies ne sont pas transmises à la fonction save_mat.
    J'ai essayé de passer les variables en global mais je ne suis pas sûr d'avoir fait ça bien : la déclaration global doit se trouver dans le corps du programme, dans la fonction check() ou dans la fonction save-mat() ?
    Pour le moment, j'ai déclaré les variables en global dans le corps du programme, et je les ai définies en StringVar().
    Du coup, elles sont acceptées, mais vides, comme si on n'avait rien saisi dans les entry et combobox de la fonction check...

    J'en suis là, et je ne sais pas trop comment gérer cette déclaration global : je sens bien que c'est ça qui déraille, mais je ne m'en sors pas...

    Merci de votre aide.
    Th

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    JE CROIS QUE J'AI TROUVE !

    Il faut déclarer le global sur TOUTES les fonctions, en cascade. Comme ça, il semble que ça marche.
    Désolé d'avoir inondé le forum de mes cogitations "à haute voix".

    Merci encore de m'avoir lu et aidé.
    Th

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 313
    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 313
    Points : 36 819
    Points
    36 819
    Par défaut
    Salut,

    Je lis, je lis.... et je croise les doigts pour que vous puissiez finir de construire votre le château de cartes avant qu'il ne s'écroule.

    - W

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Bonjour,
    Il semble que ça fonctionne alors je ferme la discussion.
    J'aurai sans doute d'autres soucis, mais on verra à ce moment là avec de nouvelles discussions.
    Merci encore.
    Th

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

Discussions similaires

  1. Injecter du HTML avec des champs dans un formulaire
    Par Ceubex dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 18/12/2012, 17h55
  2. Réponses: 4
    Dernier message: 05/06/2011, 12h28
  3. traitement des champs d'un formulaire avec PHP
    Par alfred5 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 08/04/2011, 15h36
  4. Réponses: 3
    Dernier message: 20/09/2006, 16h07
  5. Verification des champs d'un formulaire
    Par 164emie dans le forum ASP
    Réponses: 5
    Dernier message: 19/11/2003, 14h03

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