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écupération de la valeur d'un entry depuis un autre module


Sujet :

Tkinter Python

  1. #1
    Membre habitué Avatar de bringer
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2009
    Messages : 122
    Points : 137
    Points
    137
    Par défaut récupération de la valeur d'un entry depuis un autre module
    Bonjour à tous,

    dans mon appli, j'ai créé un module regroupant différentes classes d'accés à des boites de dialogue toplevel de Pmw.

    Une de ces boite est de type PromptDialog pour recupérer une entrée utilisateur.
    Mon problème est que je ne parviens pas à récupérer la valeur de saisie depuis le module principal (classe application).
    Lorsque je fais mon valeur_entry.get(), je ne parviens à récupèrer la valeur saisie que dans la classe de la boite de dialogue.

    Comment faut-il faire pour que la variable de la valeur du entry soit visible depuis mon application principale ?

    Merci de votre aide.

  2. #2
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    Hmmmm... avoir un accès à l'instance crée par le module concerné ?
    l'affichage du code source allégé de toutes les classes et méthodes ne concernant pas le problème serait le bienvenu

  3. #3
    Membre habitué Avatar de bringer
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2009
    Messages : 122
    Points : 137
    Points
    137
    Par défaut
    Bonjour N.tox

    heu, comment ça, l'affichage du code source "ne concernant pas le problème" ?

    Enfin voici le code dispo:

    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
     
    #Dans la classe de l'application principale
    def research_week(self):
        #affiche une boite de dialogue type entry
        GdiaDialogs.query_section(self.parent)
        #recupere la valeur du texte
        ???? #la je ne sait pas
     
     
    #dans le module Dialogs
    class query_section():
     
    	def __init__(self,  parent):
    		self.parent=parent
    		self.__query_section=Pmw.PromptDialog(self.parent,
    						title='Rechercher une section',
    						buttons=('Ok',  'Annuler'),
    					label_text='Saisissez la section recherchée :',
    						entryfield_labelpos='nw',
    						defaultbutton=0,
    						command=self.__execute)
     
    	def __execute(self,  commande):
    		if commande is None or commande=='Annuler':
    			self.__query_section.withdraw()
    		else:
    			value=self.__query_section.get()
    			self.__query_section.withdraw()
    Je comprends qu'il faut que la variable du entry soit visible dans l'application principale, comme dans la classe dialog, mais je ne parviens pas à la récupérée.

  4. #4
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    heu, comment ça, l'affichage du code source "ne concernant pas le problème" ?
    Ce n'est pas ce que j'ai dit, il manque un bout de phrase qui en change tout le sens
    Mais peu importe, cause tu n'a mis que les parties de codes en rapport direct avec ton problème (ce qui est ce que je te demandais)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def __execute(self,  commande):
    		if commande is None or commande=='Annuler':
    			self.__query_section.withdraw()
    		else:
    			value=self.__query_section.get()
    			self.__query_section.withdraw()
    Dans cette méthode, tu set la variable value, mais tu ne la retourne pas...
    Qui plus est, le fait que tu appelle ta méthode "__execute" la rend grossièrement inhéritable, mais surtout plus emmerdante pour y accéder, ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    >>> class A(object):
    	def __execute(self):
    		print 'foo'
     
     
    >>> a=A()
    >>> a.__execute()
    Traceback (most recent call last):
      File "<pyshell#5>", line 1, in <module>
        a.__execute()
    AttributeError: 'A' object has no attribute '__execute'
    >>> a._A__execute()
    foo
    donc, à moins de vraiment vouloir qu'un attribut ou une méthode soit entièrement propre à une classeuniquement, autant éviter les deux underscores devant des noms ... -!!! attention, le fait de rajouter deux underscores en plus a la fin annule ce comportement, et rend juste la méthode ou l'attribut, un poil plus caché pour l'autocomplétion !!!- Bref,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def _execute(self,  commande=None):
                    value    = None if (commande is None or commande=='Annuler') else self.__query_section.get()
    		 self.__query_section.withdraw()
                    return value
    devrait déjà mieux marcher, ensuite dans ta fonction research_week, tu n'affecte l'instance crée à aucune variable, ce qui signifie qu'après tu n'as plus référence vers cette dernière, et tu ne peux plus y accéder. Ceci devrait fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def research_week(self):
        #affiche une boite de dialogue type entry
        fen=GdiaDialogs.query_section(self.parent)
        #recupere la valeur du texte
        res=fen._execute('get')
        return res

  5. #5
    Membre habitué Avatar de bringer
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2009
    Messages : 122
    Points : 137
    Points
    137
    Par défaut
    Avec ton code, la fenetre toplevel ne s'ouvre pas est la variable res renvoie systematiquement None à priori.

    Dans la ligne :
    res=fen._execute('get'), tu envoie en argument le nom de la fonction. Mais la fonction execute attend le resultat d'un commande ('Ok' ou 'Annuler') non ?
    J'ai également essayer avec les commandes ok et annuler, mais cela ne fonctionne pas mieux.

    Je continu de chercher de mon coté

  6. #6
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    en fait, la modification de la fonction, ne devrait pas fonctionner, ou en tous cas retournerait la valeur de l'entry avant même que l'utilisateur n'ai tapé quoi que ce soit...

    arf, la commande du bouton Ok de de ta boite de dialogue devrait être ta méthode "_execute",
    et dans cette méthode, une fois value ayant une valeur (même None), tu devrait seter un varable de l'objet parent ou faire un appel à une méthode de l'objet parent avec value comme paramètre ...
    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def _execute(self,  commande=None):
                     value    = None if (commande is None or commande=='Annuler') else self.__query_section.get()
                     self.__query_section.withdraw()
                     self.parent.uneMethode(value)
    et la fonction researchWeek était alors presque très bien comme elle était:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def research_week(self):
        fen=GdiaDialogs.query_section(self.parent)
        return fen

  7. #7
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    Citation Envoyé par bringer Voir le message
    Avec ton code, la fenetre toplevel ne s'ouvre pas est la variable res renvoie systematiquement None à priori.

    Dans la ligne :
    res=fen._execute('get'), tu envoie en argument le nom de la fonction. Mais la fonction execute attend le resultat d'un commande ('Ok' ou 'Annuler') non ?
    J'ai également essayer avec les commandes ok et annuler, mais cela ne fonctionne pas mieux.

    Je continu de chercher de mon coté
    T'as déjà pensé à créer toi même un widget comme cette boîte de dialogue ? Au moins t'en connais le mécanisme interne... Et surtout, j'ai jamais test Pmw... J'vais essayé de te faire un exemple de ce que je voulais dire dans le précédent message...

  8. #8
    Membre habitué Avatar de bringer
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2009
    Messages : 122
    Points : 137
    Points
    137
    Par défaut
    T'as déjà pensé à créer toi même un widget comme cette boîte de dialogue ? Au moins t'en connais le mécanisme interne... Et surtout, j'ai jamais test Pmw... J'vais essayé de te faire un exemple de ce que je voulais dire dans le précédent message...
    heu, franchement , non...
    Je pensais me servir des composant déjà fait plutôt que de réinventer la roue. En plus, ces composant sont certainement mieux développés que je ne pourait le faire. Mais peut être as tu raisons, et il faut developper quelques choses perso.
    Cela me semble quand même incroyable que ça soit aussi compliquer de récupérer un "simple" Entry !!!

    Il y a aussi la possibilité que je m'em... avec du tkinter et que j'aurais du passer sur du wxpython par exemple. Mais maintenant le projet est déjà bien avancé et est surtout en beta test, alors tout reprendre l'interface...

  9. #9
    Membre habitué Avatar de bringer
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2009
    Messages : 122
    Points : 137
    Points
    137
    Par défaut
    Bon, apparemment, ça fonctionne des que l'on sort de la boucle d'evenement Tkinter. J'ai fait ce test et il marche en solo. Mais comment le reproduire en exploitation dans mon appli ?

    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
     
    class query_section():
    	def __init__(self,  parent):
    		self.parent=parent
    		self.__value=None
    		self.__query_section=Pmw.PromptDialog(self.parent,
    				title='Rechercher une section',
    				buttons=('Ok',  'Annuler'),
    				label_text='Saisissez la section recherchée :',
    				entryfield_labelpos='nw',
    				defaultbutton=0,
    				command=self.execute)
     
     
    	def execute(self,  commande=None):
    		self.__value = None if (commande is None or commande=='Annuler') else self.__query_section.get()
    		self.__query_section.withdraw()
     
    	def get_value(self):
    		return self.__value
     
     
     
    def main():
    	testapp=Tk()
    	Pmw.initialise(testapp)
    	obj=query_section(testapp)
    	testapp.mainloop()
     
    	print obj.get_value() #je sius sorti de la boucle évenement TK

  10. #10
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    Franchement se recréer un widget, n'est pas compliqué du tout, je te suggérais ça cause je ne sais pas comment fonctionne les widget pmw... J'avoue que pour certaines choses, des widgets déjà fait sont pratiques, mais pour certains, c'est pas grand chose que de les redéfinirs, surtout un popup...

    Voilà un exemple de ce que je voulais dire tout à l'heure:
    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
    from Tkinter import *
     
    class Main(Frame):
        def __init__(self,parent=None):
            Frame.__init__(self,parent)
            self.label=Label(self,text='MyVal=None')
            self.button=Button(self,text='Set value',command=lambda self=self: self.popup())
            self.label.pack()
            self.button.pack()
        def popup(self):
            popup=Popup(self)
     
    class Popup(Toplevel):
        def __init__(self,parent=None):
            Toplevel.__init__(self)
            self.parent=parent
            self.entry=Entry(self,width=6)
            self.ok=Button(self,text='Ok',command=self.sl)
            self.entry.pack()
            self.ok.pack()
        def sl(self):
            self.parent.label['text']=self.parent.label['text'].split('=')[0]+'=%s'%self.entry.get()
            self.destroy()
     
    fen=Tk()
    main=Main(fen)
    main.pack()
    fen.mainloop()

  11. #11
    Membre habitué Avatar de bringer
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2009
    Messages : 122
    Points : 137
    Points
    137
    Par défaut
    bonjour N.tox

    Je me reconnect ce matin pour te dire que j'ai trouvé une solution avec Pmw en utilisant les méthodes Activate() et deactivate(), et en combinant avec toutes les infos que tu m'as donné.
    Cela donne un code de ce type.

    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
     
    #dans le module application
    def fonction_recherche(self):
        #affiche une boite de dialogue type entry
        obj=GdiaDialogs.query_section(self.parent)
        #force la section en majuscule
        section=obj.get_section().upper()
        #autres traitements...
     
    #dans la classe toplevel
    class query_section():
     
        def __init__(self,  parent):
    	self.parent=parent
    	self.__value=None
    	self.__query_section=Pmw.PromptDialog(self.parent,
    	                             title='Rechercher une section',
    			             buttons=('Ok',  'Annuler'),
    			label_text='Saisissez la section recherchée :',
    					entryfield_labelpos='nw',
    					defaultbutton=0,
    					command=self.execute)
    		self.__query_section.activate()
     
        def execute(self,  commande=None):
    	self.__value = None if (commande is None or commande=='Annuler') else self.__query_section.get()
    	self.__query_section.deactivate()
     
        def get_section(self):
    	return self.__value
    Encore merci de ton aide et des codes que tu m'as fourni.
    Bringer

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

Discussions similaires

  1. [Tk] Récupération de la valeur d'un entry
    Par hauru dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 14/11/2011, 14h41
  2. Débutant, valeur d'une variable depuis une autre
    Par fabrice_84 dans le forum Général Python
    Réponses: 11
    Dernier message: 04/11/2009, 09h39
  3. [MySQL] Récupération d'une valeur d'une page vers une autre
    Par fidecourt dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 17/09/2007, 14h19
  4. Réponses: 10
    Dernier message: 22/08/2007, 18h07
  5. Réponses: 22
    Dernier message: 04/09/2006, 12h53

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