web-dev-qa-db-fra.com

Comment effacer le widget Entrée après avoir appuyé sur un bouton dans Tkinter?

J'essaie d'effacer le widget Entry après que l'utilisateur a appuyé sur un bouton à l'aide de Tkinter. 

J'ai essayé d'utiliser ent.delete(0, END), mais une erreur s'est produite indiquant que les chaînes ne possèdent pas l'attribut delete .

Voici mon code, où je reçois une erreur sur real.delete(0, END):

secret = randrange(1,100)
print(secret)
def res(real, secret):
    if secret==eval(real):
        showinfo(message='that is right!')
    real.delete(0, END)

def guess():
    ge = Tk()
    ge.title('guessing game')

    Label(ge, text="what is your guess:").pack(side=TOP)

    ent = Entry(ge)
    ent.pack(side=TOP)

    btn=Button(ge, text="Enter", command=lambda: res(ent.get(),secret))
    btn.pack(side=LEFT)

    ge.mainloop()
20
Dan

Après avoir fouillé un peu dans le Introduction à Tkinter , je suis arrivé avec le code ci-dessous, qui ne fait rien sauf afficher un champ de texte et le supprimer lorsque le bouton "Clear text" est enfoncé:

import tkinter as tk

class App(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master, height=42, width=42)
        self.entry = tk.Entry(self)
        self.entry.focus()
        self.entry.pack()
        self.clear_button = tk.Button(self, text="Clear text", command=self.clear_text)
        self.clear_button.pack()

    def clear_text(self):
        self.entry.delete(0, 'end')

def main():
    root = tk.Tk()
    App(root).pack(expand=True, fill='both')
    root.mainloop()

if __== "__main__":
    main()
36
GreenMatt

ent.delete(0, END) est la réponse correcte, en supposant que ent est une référence appropriée au widget d'entrée. Si vous obtenez l'erreur que vous dites, vous avez une erreur dans votre code. Vous devrez nous montrer le code si vous ne parvenez pas à localiser l'erreur vous-même.

7
Bryan Oakley

real obtient la valeur ent.get() qui est simplement une chaîne. Il n'a aucune idée de l'origine et ne peut affecter le widget.

Au lieu de real.delete(), appelez .delete() sur le widget d’entrée lui-même:

def res(ent, real, secret):
    if secret == eval(real):
        showinfo(message='that is right!')
    ent.delete(0, END)

def guess():
    ...
    btn = Button(ge, text="Enter", command=lambda: res(ent, ent.get(), secret))
4

Je ne suis pas clair sur votre question. À partir de http://effbot.org/tkinterbook/entry.htm#patterns , il semble que vous ayez juste besoin de faire une affectation après avoir appelé la suppression . Pour ajouter un texte d'entrée dans le widget, utilisez la méthode insert. Pour remplacer le texte actuel, vous pouvez appeler delete avant d'insérer le nouveau texte.

e = Entry(master)
e.pack()

e.delete(0, END)
e.insert(0, "")

Pourriez-vous poster un peu plus de code?

2
Charles Merriam

Tout d’abord, assurez-vous que le texte est activé, puis supprimez vos balises, puis le contenu.

myText.config(state=NORMAL)
myText.tag_delete ("myTags")
myText.delete(1.0, END)

Lorsque le texte est "DESACTIVE", la suppression ne fonctionne pas car le champ Texte est en lecture seule.

0
Eric B.

Vous devez procéder avec ent.delete(0,"end") au lieu d'utiliser 'END', utilisez 'end' à l'intérieur de la citation. 

 secret = randrange(1,100)
print(secret)
def res(real, secret):
    if secret==eval(real):
        showinfo(message='that is right!')
    real.delete(0, END)

def guess():
    ge = Tk()
    ge.title('guessing game')

    Label(ge, text="what is your guess:").pack(side=TOP)

    ent = Entry(ge)
    ent.pack(side=TOP)

    btn=Button(ge, text="Enter", command=lambda: res(ent.get(),secret))
    btn.pack(side=LEFT)

    ge.mainloop()

Cela résoudra votre problème

0
Prashant Mishra