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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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,

    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
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  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
    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,

    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
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  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
    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'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
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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