2010-02-14 19 views
15

Sto cercando di cancellare il widget Entry dopo che l'utente ha premuto un pulsante utilizzando Tkinter.Come cancellare il widget Entry dopo aver premuto un pulsante in Tkinter?

Ho provato a utilizzare ent.delete(0, END), ma ho ricevuto un errore che diceva che le stringhe non hanno l'attributo elimina.

Ecco il mio codice, dove sto errore di salire sul 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() 

risposta

26

Dopo aver frugato un po 'attraverso la Introduction to Tkinter, mi si avvicinò con il codice qui sotto, che non fa altro che visualizzare un campo di testo e cancellarlo quando il pulsante viene premuto "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

È possibile fornire l'argomento END (o "end") anziché calcolare la lunghezza dei dati. Dal momento che hai detto che non funzionava ma non definisci "non ha funzionato" (cioè: hai ricevuto un errore, o l'ha fatto fallire in modo silenzioso?), Suppongo che tu abbia usato una "FINE" non qualificata. Prova invece "Tkinter.END". Quando lo uso nel codice sopra funziona perfettamente. –

+0

@Bryan: Ah, ho appena usato END, non Tkinter.FINE (il tutorial usato 'da ... import' invece di importare). Grazie! La correzione è nel codice. – GreenMatt

+0

Voglio che il pulsante esegua 2 azioni contemporaneamente. il primo è quello di eseguire un'azione casuale e il secondo è quello di cancellare la voce – Dan

2

Sono poco chiaro circa la tua domanda. Da http://effbot.org/tkinterbook/entry.htm#patterns, è sembra che devi fare un compito solo dopo aver chiamato l'eliminazione. Per aggiungere il testo della voce al widget, utilizzare il metodo di inserimento. Per sostituire il testo corrente, puoi chiamare delete prima di inserire il nuovo testo.

e = Entry(master) 
e.pack() 

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

Potresti postare un po 'di codice in più?

+0

La risposta "sembra che solo bisogno di fare un incarico dopo aver chiamato la cancellazione" in alcun modo risponde alla domanda "come cancellare il widget di ingresso". –

+0

Questo mi ha aiutato molto: e.delete (0, FINE), grazie Charles. –

4

real ottiene il valore ent.get() che è solo una stringa. Non ha idea da dove provenga, e nessun modo per influenzare il widget.

Invece di real.delete(), chiamare .delete() sul widget di entrata in 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) è la risposta corretta, supponendo che ent è un adeguato riferimento al widget di ingresso. Se ottieni l'errore che dici di fare, hai un errore nel codice. Dovrai mostrarci il codice se non sei in grado di individuare da solo l'errore.

-6

prova con questo:

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

si prega di considerare l'aggiunta di ifo minimo per comprendere il codice –

+3

No, questo assolutamente non funzionerà. Ciò cancella lo schermo, non un widget in una finestra. –

+0

Questo non ha nulla a che fare con la domanda. – cpburnz

0

Prima di tutto, assicurarsi che il testo sia abilitato, quindi eliminare i tag, e quindi il contenuto.

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

Quando il testo è "DISABILITA", l'eliminazione non funziona perché il campo Testo è in modalità di sola lettura.

0

È necessario procedere con ent.delete(0,"end") anziché utilizzare "FINE", utilizzare "fine" all'interno dell'offerta.

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

Ciò deve risolvere il problema

Problemi correlati