2010-02-14 1660 views
15

Estoy tratando de borrar el widget Entry después de que el usuario presiona un botón con Tkinter.¿Cómo borrar el widget de entrada después de presionar un botón en Tkinter?

Intenté usar ent.delete(0, END), pero me salió un error al decir que las cadenas no tienen el atributo eliminar.

Aquí está mi código, donde yo estoy error en 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() 

Respuesta

26

Después de hurgar un poco a través de la Introduction to Tkinter, me ocurrió con el código de abajo, que no hace nada más que mostrar un campo de texto y desactivarla cuando el botón se pulsa "Clear text":

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

Puede suministrar el argumento END (o "end") en lugar de calcular la longitud de los datos. Dado que usted dice que no funcionó, pero no define "no funcionó" (es decir, ¿recibió un error o falló silenciosamente?), Supongo que usó un "FINAL" no calificado. Pruebe "Tkinter.END" en su lugar. Cuando uso eso en el código anterior funciona bien. –

+0

@Bryan: Ah, acabo de utilizar END, no Tkinter.END (el tutorial utilizado 'from ... import' en lugar de simplemente importar). ¡Gracias! La solución está en el código. – GreenMatt

+0

Quiero que el botón realice 2 acciones al mismo tiempo. el primero es realizar una acción aleatoria y el segundo es borrar la entrada – Dan

2

estoy claro acerca de su pregunta. Desde http://effbot.org/tkinterbook/entry.htm#patterns, parece que solo necesita hacer una tarea después de llamar a la eliminación. Para agregar texto de entrada al widget, use el método de inserción. Para reemplazar el texto actual, puede llamar a eliminar antes de insertar el nuevo texto.

e = Entry(master) 
e.pack() 

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

¿Podría publicar un código más?

+0

La respuesta "parece que sólo tiene que hacer una asignación después de que llamó la eliminación" de ninguna manera responde a la pregunta "¿Cómo limpiar el widget de entrada". –

+0

Esto me ayudó mucho: e.delete (0, END), gracias Charles. –

4

real obtiene el valor ent.get() que es solo una cadena. No tiene idea de dónde vino y no hay forma de afectar el widget.

En lugar de real.delete(), llame .delete() en el widget de entrada en sí:

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) es la respuesta correcta, suponiendo que ent es una referencia adecuada para el widget de entrada. Si obtiene el error que dice que tiene, tiene un error en su código. Necesitará mostrarnos el código si no puede detectar el error usted mismo.

-6

intento con esto:

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

por favor considere agregar ifo mínimo para comprender el código –

+3

No, esto no funcionará en absoluto. Esto borra la pantalla, no un widget en una ventana. –

+0

Esto no tiene nada que ver con la pregunta. – cpburnz

0

En primer lugar, asegúrese de que el texto está activada, a continuación, elimine las etiquetas, y luego el contenido.

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

Cuando el texto es "DISABLE", el borrado no está disponible debido a que el campo de texto está en modo de sólo lectura.

0

Deberá proceder con ent.delete(0,"end") en lugar de usar 'END', use 'end' dentro de la cita.

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() 

Esto deberá resolver su problema

Cuestiones relacionadas