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

GUI Python Discussion :

Récupérer valeur d'un "Entry" d'un fichier 'A' depuis une fonction dans un autre fichier 'B' [Python 3.X]


Sujet :

GUI Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Andorre

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2016
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Récupérer valeur d'un "Entry" d'un fichier 'A' depuis une fonction dans un autre fichier 'B'
    Bonjour la communauté,

    Je m'initie doucement à Python (3.6.02b) et suis actuellement à la partie GUI.
    Voici mon problème:
    Je crée un formulaire dans un fichier "main" (avec Label et Entry) puis je tente de récupérer la valeur des Entry via une fonction située sur un fichier "function" importé dans "main" (évidement).
    Sauf que Python ne reconnaît pas la variable de mon Entry (undefined).
    Pourtant ma fonction est bien importée et la variable "entreeType" devrait être accessible non ?
    Voici le code allégé (car plusieurs Label, Entry)
    Code de "formulaireMain.py"
    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
     
    # coding:UTF_8 
    # import des modules
    from tkinter import *
    from formulaireFunctions import retour
     
    # crée la fenêtre
    root = Tk()
     
    # création des widgets 'Label' + affection de l'emplacement sans passer par une variable pour économie de mémoire
    Label(root, text="Type de l'annonce:").grid(row =0, column = 0, sticky =E)
    # ...
    # ... Un formulaire est créé (code allégé)
    # ...
    # création des widgets 'Entry' + placement dans la fenetre. Obligé de passer par une variable contenant la
    # référence à l'instance 'Entry' pour la manipuler par la suite
    entreeType = Entry(root)
    entreeType.grid(row =0, column =1)    
    # ...
    # ... Un formulaire est créé (code allégé)
    # ...
     
    # récupére les valeurs entrées via touche ENTER
    root.bind("<Return>", retour)
     
    # boucle pour permettre l'interaction utilisateur (clavier, souris)
    root.mainloop()
    Code "formulaireFunctions"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    # coding:UTF_8 
    def retour(event):
    	"""Fonction pour récupérer les entrées"""
    	print(entreeType.get())  # juste pour tester
    Bref je ne comprend pas, j'ai essayé de mettre "entreeType" en global mais ça ne change rien
    J'espère que ce n'est pas une histoire de classe car pas encore lu ce chapitre.
    D'avance merci pour votre aide

    Nb: Je passe par un autre fichier pour la clarté finale du programme (j'aurais plusieurs fonction), la création de la fenêtre (Label, Entry, Button, ect..) le sera également (enfin si possible).

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


    Citation Envoyé par 4n42x1 Voir le message
    Pourtant ma fonction est bien importée et la variable "entreeType" devrait être accessible non ?
    La portée d'une variable (globale) est limité au module (le script qui la définit).
    Donc, si la variable n'est pas définie dans le module formulaireFunctions, elle n'existe pas.
    La solution peut être de la définir via import comme pour la définition de la variable "retour", mais vous allez faire des import circulaire et çà ne marchera toujours pas.

    Citation Envoyé par 4n42x1 Voir le message
    j'ai essayé de mettre "entreeType" en global mais ça ne change rien
    J'espère que ce n'est pas une histoire de classe car pas encore lu ce chapitre.
    Ce n'est pas une histoire de classe mais d'espaces de nommage et de portée qu'il vous sera plus facile de maîtriser lorsque vous aurez vu ce que sont les classes (car les modules sont des sortes de classes).

    Vous avez 3 façons de vous en sortir.
    La première est de patienter un peu avant de vouloir découper votre script en modules.
    La seconde est d'utiliser les fonctionnalités de tkinter. Lorsque vous écrivez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def retour(event):
    	"""Fonction pour récupérer les entrées"""
    	...
    event est l'instance d'une classe qui contient l'attribut widget qui est justement l'entry...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def retour(event):
    	"""Fonction pour récupérer les entrées"""
            entreeType = event.widget
            print(entreeType.get())  # juste pour tester
    	...
    La 3ème est plus "Pythonesque":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    root.bind("<Return>", lambda e: retour(entreeType))
    puis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def retour(entreeType):
    	"""Fonction pour récupérer les entrées"""
            print(entreeType.get())  # juste pour tester
    	...
    Ce qui revient à fabriquer une fonction qui absorbe l'event passé normalement et appelle la fonction avec l'entry en paramètre.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Andorre

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2016
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Merci de ta réponse

    La solution 2 fonctionne mais je vais attendre avant de l'utiliser car je ne comprends pas encore toute sa subtilité. De plus je dois faire ça pour une dizaine d'Entry
    Je vais le faire sans découpage de code, je comprendrais mieux par la suite

    Merci encore d'avoir proposé ces solutions

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 09/11/2011, 12h06
  2. Réponses: 1
    Dernier message: 25/01/2010, 09h07
  3. Réponses: 8
    Dernier message: 28/04/2008, 13h28

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