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 :

Tkinter: Comment fait on pour remplacer input ?


Sujet :

Tkinter Python

  1. #1
    Invité
    Invité(e)
    Par défaut Tkinter: Comment fait on pour remplacer input ?
    Bonsoir,

    Après avoir programmé une base de données qui fonctionne et qui me permet de l'interroger comme je le souhaite, je me heurte à Tkinter.
    C'est presque plus compliqué que le programme lui-même. Et même, ça l'est (je le crois vraiment).

    Mon problème parait simple mais je ne parviens pas à le coder.

    Comment fait-on pour interrompre son programme tel que le fait "input" en linéaire pour attendre que l'utilisateur entre les éléments dans le widget "Entry" ? Autrement dit que pour que entry, déclarer plus tôt lors de la phase __init__, prenne la main et attende de recevoir sa pitance.

    J'en perds mon latin, enfin mon p.t.on.

    Merci , mais vraiment merci ...

  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,

    Citation Envoyé par ceststef Voir le message
    Comment fait-on pour interrompre son programme tel que le fait "input" en linéaire pour attendre que l'utilisateur entre les éléments dans le widget "Entry" ?
    On ne peut pas.

    C'est ce qui fait la spécificité de la programmation d'une interface graphique telle que tkinter.

    Et l'intérêt de prendre le temps de maîtriser cela en passant du temps dans un tuto. avant.

    - W

  3. #3
    Invité
    Invité(e)
    Par défaut Trois semaines que je passe du temps sur des tutos
    Bonjour,

    Naturellement que j'ai passé du temps sur des tutos. Et c'est bien pour cela que j'en viens désormais à appeler à l'aide.

    Je vous présente un bout de code et je vous explique ce qui coince:

    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
    class Win():
     
        def __init__(self):       
     
            def capter(self, event):
                entry1.get()
     
            self.root = Tk() 
            self.root.title("Stef") 
            self.root.geometry("1500x1000")     
            self.root.config(bg='black')
     
            self.police= "{arial} 18 " 
     
            # création Label1
            self.label1= Label(self.root, text="\n\nBienvenue", fg="gray27",bg="black", font=self.police)
            self.label1.pack()
     
            # création Label2
            self.label2= Label(self.root, text="En attente du choix dans le menu", fg="gray27",bg="black", font=self.police)
            self.label2.pack()
     
            #création Entry1
            self.saisir=StringVar()
            self.saisir.set("")
            self.entry1 =Entry(self.root, textvariable=self.saisir, bd=0, highlightcolor='gray20', highlightbackground='gray10', insertbackground='gray20', highlightthickness=1, bg="gray8", fg="thistle4", font='arial 20', justify='left', width=40)        
            self.entry1.pack(side=BOTTOM, pady =60)
            self.entry1.bind("<Return>", self.capter)
            self.root.mainloop()

    Ensuite, plus tard, durant mon programme, j'ai besoin de récupérer une valeur entrée par l'utilisateur et je fais ceci:



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        def quelJour(self):     
            auto =-1
            while auto ==-1 :
                self.affichageLabel2('\n\nJour :')
                jour =self.entry1.bind()
     
                if jour == '':                
                    auto =0
                    self.accueil()                          
                else:
                    # le prog continue

    Mon problème, c'est que le programme ne laisse pas le temps à l'utilisateur d'entrée des données via le widget entry1.
    Il récupère la valeur vide déclarée à la création.
    Mon souhait serait que le programme attende la réception d'une action de l'utilisateur.
    Il y a là quelque chose qui m'échappe.
    Pourriez-vous éclairer un camarade, qui croyez-le bien, en a lu des tutos.

    Je vous remercie platement.

  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,

    Citation Envoyé par ceststef Voir le message
    Et c'est bien pour cela que j'en viens désormais à appeler à l'aide.
    Pour que l'utilisateur signale la fin de la saisie, il faut un évènement.
    Apparemment vous avez choisi <Return>, pourquoi pas?

    Mais vous ne montrez pas la méthode associée. self.capter n'est pas la fonction déclarée en local qui ne fait pas grand chose de ce qu'il ne peut pas récupèrer...

    On ne sait pas quand est appelé le code supposé s'exécuter "plus tard" et dans ce que vous montrez, il n'y a pas de lecture de l'entry ni de la variable associée.


    - W

  5. #5
    Invité
    Invité(e)
    Par défaut Salut
    Je vous remets mon code initial car celui transmis supra contenait des essais et on finit par se perdre ...
    Voilà donc ce que je tentais au départ et qui me paraissait être juste:

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    from tkinter import *
     
    class Win():
     
        def __init__(self): 
            self.root = Tk() 
            self.root.title("Stef") 
            self.root.geometry("1500x1000")     
            self.root.config(bg='black')        
            self.police= "{arial} 18 "        
            # création Label1
            self.label1= Label(self.root, text="\n\nBienvenue", fg="gray27",bg="black", font=self.police)
            self.label1.pack()
     
            # création Label2
            self.label2= Label(self.root, text="En attente du choix dans le menu", fg="gray27",bg="black", font=self.police)
            self.label2.pack()
     
     
            self.entry1 =Entry(self.root, text='', bd=0, highlightcolor='gray20', highlightbackground='gray10', insertbackground='gray20', highlightthickness=1, bg="gray8", fg="thistle4", font='arial 20', justify='left', width=40)        
            self.entry1.pack(side=BOTTOM, pady =60)
            self.entry1.bind("<Return>", self.capter)
     
            self.add_menu()
            self.root.mainloop()
     
     
        def capter(self, event):
            self.entry1.get()
     
     
        def quitter(self):
            self.root.destroy()
     
     
        def add_menu(self) :
        # 1 − Création de la barre des menus
            menuBar = Menu(self.root)
        # 2 − Création du menu Courses
            menuCourses = Menu(menuBar, tearoff=0)
            menuBar.add_cascade(label = "Fiches" ,menu=menuCourses)
            # Création des sous menus du menu Courses
            menuCourses.add_command(label="Nouvelle", command=self.quelJour) 
            menuCourses.add_command(label="Compléter", command=self.quelJour)        
            menuCourses.add_command(label="Quitter", command = self.quitter)
            self.root.configure(menu = menuBar)
     
     
        def quelJour(self):    
            self.affichageLabel2('\n\nJour :')
            self.entry1.focus()
            jour =self.capter()
     
            if jour == '':                
                self.accueil()                   
            else:
                jourbis =jour
            try:                                                
                jourbis =int(jourbis)                        
            except:                                             
                self.affichageLabel2 ('CHIFFRES uniquement. Réessayez.')
                self.quelJour()            
            longJour = len(jour)
            if longJour==2 :                                
                if jourbis <1 or jourbis >31:               
                    print ('Jour entre 01 et 31.')
                    self.quelJour()                                      
                else:                                                   
                    return jour                                      
            else:                                            
                print ('SEULEMENT DEUX chiffres.')
                self.quelJour()
     
     
        def accueil(self):
            self.affichageLabel1('\n\nRetour à l\'accueil')
            self.affichageLabel2('')
     
     
        def affichageLabel2(self, texte):
            self.label2["text"]= ''
            self.label2.update()
            a=str(texte)
            self.label2["text"]= a
            self.label2.update()
     
     
        def affichageLabel1(self, texte):
            self.label1["text"]= ''
            self.label1.update()
            a=str(texte)
            self.label1["text"]= a
            self.label1.update()
     
     
    if __name__ == '__main__':
        app = Win()
    Ce code est livré à minima car tout l'aspect d'échange avec la base de données n'est pas utile pour comprendre ce qui nous occupe.
    On peut donc voir que j'initie l'objet au départ (pardon je m'exprime avec mes mots). Par la même, j'ajoute la création du menu et enfin je lance le main loop.

    C'est par le biais de la barre menu que je fais appel à la méthode "quelJour".
    Voilà de quelle façon je tente de faire entrer par l'utilisateur le nombre correspondant à un jour.
    Entry1 réceptionne bien le focus. Mais ça plante.
    J'ai eu beau tenter plein de choses, rien n'y fait.

    Mais j'ai bon espoir d'y parvenir, un jour, mais "quelJour" ?


    Quoiqu'il en soit merci d'avance, c'est déjà gentil de phosphorer pour mon problème.

  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'utilisateur peut signaler la fin de la saisie (dans l'Entry) avec un <Return> qui appelle la méthode capter qui ne fait rien.

    Il peut aussi entrer les commandes "Nouvelle" ou Compléter" qui lancent la méthode quelJour qui récupérera None de la méthode capter que l'utilisateur ait saisi quelque chose ou pas dans l'Entry.

    Jusque là rien de bien transcendant, on relit le code en essayant de se mettre à la place de l'interpréteur Python pour comprendre ce qu'il peut en faire.

    A mon sens, le soucis, est que la méthode capter ne retourne rien.
    Un soucis à régler est que quelJour peut être lancé que l'utilisateur ait saisi quelque chose ou pas.

    Mais le plus gros soucis est que si vous n'arrivez pas à relire/comprendre ce que fait un code pas si compliqué, c'est que vous avez loupé quelque chose.

    - W

  7. #7
    Invité
    Invité(e)
    Par défaut Eh oui
    Bonsoir, bonsoir

    Je reviens vers ce que vous indiquez.
    En préambule, je tiens à vous dire qu'il vaut mieux ignorer dans le menu, le label "compléter" lié à la même command self.quelJour, c'est tout simplement que je n'ai pas codé pour cela puisque je me heurte déjà à des difficultés pour "nouvelle". C'était pour ne pas à avoir de bug du type "méthode inconnue".

    Ce que ne pige pas, c'est quand vous indiquez que la méthode "capter" ne fait rien, pourtant je tente bien de récupérer ce qui est entré par l'utilisateur ? Non ?
    Où se trouve l'erreur ?

    Que j'ai pu louper quelque chose, j'en suis très conscient, mais quoi ?
    Qu'est-ce qui cloche ?

  8. #8
    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,

    Citation Envoyé par ceststef Voir le message
    Ce que ne pige pas, c'est quand vous indiquez que la méthode "capter" ne fait rien, pourtant je tente bien de récupérer ce qui est entré par l'utilisateur ?
    Ca fait juste ce qui est écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        def capter(self, event):
            self.entry1.get()
    lire le contenu de l'entry. mais pour en faire quoi?

    Plus loin vous écrivez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        def quelJour(self):    
            self.affichageLabel2('\n\nJour :')
            self.entry1.focus()
            jour =self.capter()
    Comme il manque un argument à l'appel de capter, çà plante avec un message d'erreur sur la console.

    - W

  9. #9
    Invité
    Invité(e)
    Par défaut J'ai "capter" mais pas assez
    Bonjour,

    J'ai bien tenté ceci, ce que j'avais déjà fait par le passé, mais rien n'y fait:
    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
     
        def capter(self, event):
            return self.entry1.get()
     
     
     
        def quelJour(self):    
            self.affichageLabel2('\n\nJour :')
            self.entry1.focus()
            jour =self.capter(event)
     
            if jour == '':                
                self.accueil()                   
            else:
                jourbis =jour
            try:                                                
                jourbis =int(jourbis)                        
            except:                                             
                self.affichageLabel2 ('CHIFFRES uniquement. Réessayez.')
                self.quelJour()            
            longJour = len(jour)
            if longJour==2 :                                
                if jourbis <1 or jourbis >31:               
                    print ('Jour entre 01 et 31.')
                    self.quelJour()                                      
                else:                                                   
                    return jour                                      
            else:                                            
                print ('SEULEMENT DEUX chiffres.')
                self.quelJour()

  10. #10
    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,

    Citation Envoyé par ceststef Voir le message
    J'ai bien tenté ceci, ce que j'avais déjà fait par le passé, mais rien n'y fait
    event n'étant pas défini, çà plante avec un autre message d'erreur.

    Simplifiez! Pourquoi ne pas écrire jour = self.entry1.get()?
    Pour peu que l'utilisateur ait renseigné l'Entry avant de lancer la commande du Menu... çà devrait suffire.

    - W

  11. #11
    Invité
    Invité(e)
    Par défaut Pas de cette façon
    Non ce n’est pas ce que je souhaite. Je veux pouvoir faire appel à mon widget dès que mon programme réclame l’entrée d’une donnée par l’utilisateur.
    Je ne comprends pas qd vous indiquez que event n’est pas défini. L’evenement qui consiste à enfoncer la touche <return> n’est t-il pas défini dans mon bind ?
    Après je replace «*event*» entre parenthèses qd je définis la fonction rattachée à <return> J’ai fait ce que j’ai lu dans maintes exemples.

    En fait, la question c’est comment coder qd on veut faire appel à un widget entry préalablement défini en __init__ dès qu’on souhaite contraindre l’utilusateur d’entrer une valeur que l’on veut récupérer pour orienter la suite du programme ?

  12. #12
    Invité
    Invité(e)
    Par défaut
    Et puis l’utilisateur ne peut pas avoir rempli jour avant que la question ne lui soit posée. En faisant comme vous indiquez, le prog récupère étonnamment sans action sur return et forcément c vide.

  13. #13
    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,

    Citation Envoyé par ceststef Voir le message
    dès qu’on souhaite contraindre l’utilusateur d’entrer une valeur que l’on veut récupérer pour orienter la suite du programme ?
    La façon la plus "standard" est de créer une boîte de dialogue "modale" qui propose à l'utilisateur d'entrer/saisir des données et d'appuyer sur un bouton "valider" (et terminer la saisie).

    Dans votre cas, vous pouvez aussi désactiver les commandes du Menu et les activer lorsque l'utilisateur aura tapé <Return>.

    Vous pouvez aussi vous contenter de récupérer la saisie, constater qu'elle est vide, afficher un message d'erreur indiquant à l'utilisateur quoi faire...

    En tous cas, vous devez faire avec ce que tkinter vous propose.

    - W

  14. #14
    Invité
    Invité(e)
    Par défaut
    Oui c’est ce dernier cas qui m’interesse mais c’est deja ce que je fais, non ?
    Mais qu’est ce qui concrètement ne va pas dans mon programme ?
    Corrigez moi que je puisse définitivement comprendre.
    Dernière modification par Invité ; 12/05/2020 à 11h15.

  15. #15
    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,

    Citation Envoyé par ceststef Voir le message
    Oui c’est ce dernier cas qui m’interesse mais c’est deja ce que je fais, non ?
    Déjà il faudrait récupérer le contenu de la saisie sans que çà plante. J vous ai proposé jour = self.entry1.get() mais vous n'en voulez pas

    Puis comprendre que si la saisie est invalide, appeler self.quelJour() exécute immédiatement cette méthode sans donner le temps à l'utilisateur d'avoir saisi quoi que ce soit.

    Citation Envoyé par ceststef Voir le message
    Corrigez moi que je puisse définitivement comorendre.
    Ce que je peux vous proposer c'est juste ces quelques lignes de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        def quelJour(self):    
            jour = self.entry.get()
            if not(jour and jour.isdigit()):
                 self.affichageLabel2 ('CHIFFRES uniquement. Réessayez.')
                 return
            jour = int(jour)
            if not (1 <= jour <= 31):            
                 self.affichageLabel2 ('Jour entre 01 et 31.')
                 return
            # ici on a dans "jour" un entier dans 1..31
    Pour le reste, débrouillez vous!

    Il est visible que vous êtes parti d'un programme qui fonctionne avec une interface "console" et que vous voulez le relooker avec une interface graphique sans imaginer/réaliser que toute la conception est à repenser.

    Si vous n'avez pas pris le temps d'apprendre à penser avec ce genre d'interface, sûr que c'est plein de surprises.
    Mais à part vous recommander (encore) de prendre le temps de potasser le sujet avec un bon tuto. je ne peux pas grand chose pour vous.

    - W

  16. #16
    Invité
    Invité(e)
    Par défaut Ça fonctionne.
    C'est bon j'ai trouvé ce qui dysfonctionnait: il manquait juste un "event" quelque part.

    Merci pour le coup de main.

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/02/2012, 18h22
  2. Comment fait-on pour ajouter une signature à son profil ?
    Par mullger dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 2
    Dernier message: 28/04/2006, 16h42
  3. [IIS]Comment fait-on pour installer IIS ?
    Par Filippo dans le forum IIS
    Réponses: 4
    Dernier message: 09/04/2006, 21h02
  4. [Struts]comment faites-vous pour enregistrer..
    Par pouss dans le forum Struts 1
    Réponses: 7
    Dernier message: 30/09/2005, 12h55
  5. Réponses: 6
    Dernier message: 08/04/2005, 03h00

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