web-dev-qa-db-de.com

Wie lösche ich das Eintrags-Widget, nachdem in Tkinter eine Taste gedrückt wurde?

Ich versuche das Widget Entry zu löschen, nachdem der Benutzer eine Schaltfläche mit Tkinter gedrückt hat. 

Ich habe versucht, ent.delete(0, END) zu verwenden, bekam jedoch eine Fehlermeldung, dass Strings nicht das Attribut delete haben.

Hier ist mein Code, wo ich Fehler bei real.delete(0, END) bekomme:

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

Nachdem ich mich ein wenig durch die Einführung in Tkinter gestöbert habe, habe ich den folgenden Code gefunden, der nichts tut, außer ein Textfeld anzuzeigen und es zu löschen, wenn die "Clear text"-Taste gedrückt wird:

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) ist die richtige Antwort, vorausgesetzt, ent ist ein richtiger Verweis auf das Eintrags-Widget. Wenn Sie die Fehlermeldung erhalten, die Sie angeben, liegt ein Fehler in Ihrem Code vor. Sie müssen uns den Code zeigen, wenn Sie den Fehler nicht selbst erkennen können.

7
Bryan Oakley

real erhält den Wert ent.get(), der nur eine Zeichenfolge ist. Es hat keine Ahnung, woher es kommt, und es gibt keine Möglichkeit, das Widget zu beeinflussen.

Rufen Sie anstelle von real.delete().delete() im Eintrags-Widget selbst auf:

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

Ihre Frage ist mir nicht klar. Von http://effbot.org/tkinterbook/entry.htm#patterns scheint es, dass Sie nur eine Aufgabe machen müssen, nachdem Sie delete ..__ aufgerufen haben. Verwenden Sie die Einfügemethode. Um den aktuellen Text zu ersetzen, können Sie delete aufrufen, bevor Sie den neuen Text einfügen.

e = Entry(master)
e.pack()

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

Könnten Sie etwas mehr Code posten?

2
Charles Merriam

Stellen Sie zunächst sicher, dass der Text aktiviert ist, löschen Sie dann Ihre Tags und anschließend den Inhalt.

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

Wenn der Text "DISABLE" ist, funktioniert das Löschen nicht, da das Textfeld schreibgeschützt ist.

0
Eric B.

Sie sollten mit ent.delete(0,"end") fortfahren, anstatt 'END' zu verwenden, und verwenden Sie 'Ende' im Zitat. 

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

Dies wird Ihr Problem lösen

0
Prashant Mishra
def clear():                                                                           
        global input                                                                    
        abc =  
        input.set(abc)                                                                     

root = Tk()                                                               
input = StringVar()                                                             
ent = Entry(root,textvariable =                                       input,font=('ariel',23,'bold'),bg='powder                            blue',bd=30,justify='right').grid(columnspan=4,ipady=20)                       
Clear = Button(root,text="Clear",command=clear).pack()                       

Bei der Eingabe wird die Textvariable im Eintrag festgelegt, bei der es sich um die Zeichenfolgenvariable handelt. Wenn ich den Text der Zeichenfolgenvariablen auf "" setze, wird der Text im Eintrag gelöscht

0
Darnal Adrian