2010-02-14 8 views
15

J'essaie d'effacer le widget Entry après que l'utilisateur appuie sur un bouton en utilisant Tkinter.Comment effacer le widget Entrée après avoir appuyé sur un bouton dans Tkinter?

J'ai essayé d'utiliser ent.delete(0, END), mais j'ai reçu une erreur disant que les chaînes n'ont pas l'attribut supprimer.

Voici mon code, où je reçois 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() 

Répondre

26

Après farfouillé un peu par la Introduction to Tkinter, je suis venu avec le code ci-dessous, qui ne fait rien sauf afficher un champ de texte et clair quand le bouton "Clear text" est poussé:

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 __name__ == "__main__": 
    main() 
+1

Vous pouvez fournir l'argument END (ou "end") au lieu de calculer la longueur des données. Puisque vous dites que cela n'a pas fonctionné mais que vous ne définissez pas "ne fonctionne pas" (par exemple: avez-vous eu une erreur ou avez-vous échoué silencieusement?), Je suppose que vous avez utilisé un "END" non qualifié. Essayez plutôt "Tkinter.END". Lorsque je l'utilise dans le code ci-dessus, cela fonctionne très bien. –

+0

@Brian: Ah, je viens d'utiliser END, pas Tkinter.END (le tutoriel utilisait 'from ... import' au lieu de simplement importer). Merci! Le correctif est dans le code. – GreenMatt

+0

Je veux que le bouton effectue 2 actions en même temps. le premier est d'effectuer une action aléatoire et le 2ème est d'effacer l'entrée – Dan

2

Je suis pas clair au sujet de votre question. De http://effbot.org/tkinterbook/entry.htm#patterns, il semble que vous avez juste besoin de faire une affectation après avoir appelé la suppression. Pour ajouter du texte d'entrée au 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?

+0

La réponse « il semble que vous avez juste besoin de faire une mission après avoir appelé la suppression » en aucun cas répond à la question « comment effacer le widget d'entrée ». –

+0

Cela m'a beaucoup aidé: e.delete (0, END), merci Charles. –

4

real obtient la valeur ent.get() qui est juste une chaîne. Il n'a aucune idée d'où il vient, et aucun moyen d'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)) 
5

ent.delete(0, END) est la bonne réponse, 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 êtes incapable de repérer l'erreur vous-même.

-6

Essayez avec ceci:

import os 
os.system('clear') 
+1

s'il vous plaît envisager d'ajouter un minimum ifo pour comprendre le code –

+3

Non, cela ne fonctionnera absolument pas. Cela efface l'écran, pas un widget dans une fenêtre. –

+0

Cela n'a rien à voir avec la question. – cpburnz

0

Tout d'abord, assurez-vous que le texte est activé, puis supprimez vos balises, puis le contenu. Lorsque le texte est "DÉSACTIVÉ", la suppression ne fonctionne pas car le champ Texte est en mode lecture seule.

0

Vous devez procéder avec ent.delete(0,"end") au lieu d'utiliser 'END', utilisez 'end' entre guillemets.

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 doit résoudre votre problème

Questions connexes