3 votes

Les premières lettres d'une entrée Tkinter

Mon programme devrait vérifier si les trois premières lettres du mot saisi sont similaires à un mot prédéfini.
J'ai créé une interface graphique avec Tkinter et je veux obtenir les lettres du champ de saisie.
D'une manière ou d'une autre, je n'arrive pas à l'implémenter comme je le ferais sans Tkinter.

Voici comment je le fais juste pour le shell :

text = raw_input('Entrer un mot : ')

if (text[0] + text[1] + text[2] == 'sag'):
    print "sagen"
else:
    print "erreur"

Donc, quand je saisis le mot "sagst", il vérifie les trois premières lettres et devrait afficher "sagen". Cela fonctionne bien.

J'ai appris que par exemple inputfield.get() obtient la saisie de l'entrée "inputfield".
Mais comment puis-je vérifier les premières lettres de ce "inputfield" ?
Une petite sélection :

from Tkinter import*
root = Tk()

def check():
    if (text[0] + text[1] + text[2] == 'sag'):
        print "Vrai"
    else:
        print "Faux"

inputfield = Entry(root)
inputfield.pack()

but = Button(root, text='Vérifier!', command = check)
but.pack()

text = inputfield.get()

root.mainloop()

Ne fonctionne pas...

J'espère que vous comprenez ma question et répondrez bientôt. (Désolé pour mon mauvais anglais et mes compétences limitées en Python) ;-)
Merci !

3voto

Martijn Pieters Points 271458

Votre fonction check devra récupérer le champ de texte après que le bouton ait été pressé :

def check():
    text = inputfield.get()
    print text.startswith('sag')

J'ai modifié un peu votre test, en utilisant .startswith(), et en imprimant directement le résultat de ce test (print transformera le booléen True ou False en la chaîne correspondante).

Ce qui se passe dans votre code est que vous définissez inputfield, récupérez son contenu (évidemment vide), et seulement ensuite affichez la fenêtre GUI TKInter en lançant la boucle principale. L'utilisateur n'a jamais la possibilité d'entrer du texte de cette manière.

2voto

mgilson Points 92954

Vous pouvez également vérifier ceci sans avoir besoin d'un bouton (Maintenant il vérifiera chaque fois que l'utilisateur appuie sur "Entrée"):

from Tkinter import *
root = Tk()
def check(*event):
    text = inputfield.get()
    print text.startswith('sag')

inputfield = Entry(root)
inputfield.bind('',check)
inputfield.pack()
root.mainloop()

Vous pouvez également faire d'autres choses pour que votre widget valide l'entrée au fur et à mesure que vous tapez. (Le lien est ancien, mais il pointe également vers de nouvelles fonctionnalités qui vous permettent de le faire sans sous-classement).

0voto

unutbu Points 222216

Voici une version qui utilise un widget Entry qui valide son contenu à mesure que l'utilisateur tape (donc l'utilisateur n'a pas besoin de cliquer sur un bouton ou même d'appuyer sur Retour).

import Tkinter as tk
class MyApp(object):
    '''
    http://effbot.org/zone/tkinter-entry-validate.htm
    http://effbot.org/tkinterbook/entry.htm
    http://www.tcl.tk/man/tcl8.5/TkCmd/entry.htm#M-validate
    '''
    def __init__(self, master):
        vcmd = (master.register(self.validate),
                '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')
        self.entry = tk.Entry(master, validate = 'key',
                              validatecommand = vcmd)
        self.entry.pack()
        self.entry.focus()

    def validate(self, action, index, value_if_allowed,
                   prior_value, text, validation_type, trigger_type, widget_name):
        dtype = {'0':'delete', '1':'insert', '-1':'other'}[action]
        n = min(3, len(value_if_allowed))
        valid = False
        if dtype == 'insert':
            if value_if_allowed[:n] == 'sag'[:n]: valid = True
            else: valid = False
        else: valid = True
        print(valid)
        return True

root = tk.Tk()
app = MyApp(root)
root.mainloop()

0voto

jgritty Points 4179

Vous n'insérez pas réellement la valeur dans le champ de saisie dans la variable de texte.

J'ai renommé la valeur de texte en input_text car c'était confus pour moi. J'ai également changé de text[0] + text[1] + text[2] à startswith(). Cela vous évitera d'obtenir des erreurs d'index sur les courtes chaînes et est beaucoup plus pythonique.

from Tkinter import*
root = Tk()

def check():
    input_text = inputfield.get()
    if input_text.startswith('sag'):
        print "True"
    else:
        print "False"

inputfield = Entry(root)
inputfield.pack()

input_text = inputfield.get()
print input_text # Note that this never prints a string, because it only prints once when the input is empty.

but = Button(root, text='Check!', command=check)
but.pack()

root.mainloop()

La modification principale est que la fonction check doit en réalité récupérer la valeur dans le champ de saisie inputfield.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X