2010-02-14 2 views
15

Ich versuche, das Widget Entry zu löschen, nachdem der Benutzer eine Taste mit Tkinter gedrückt hat.Wie wird das Eingabe-Widget gelöscht, nachdem eine Schaltfläche in Tkinter gedrückt wurde?

Ich versuchte mit ent.delete(0, END), aber ich habe eine Fehlermeldung, dass Zeichenfolgen nicht das Attribut löschen haben.

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

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

Antwort

26

Nachdem durch die Introduction to Tkinter um ein bisschen Stossen, kam ich unten mit dem Code auf, die nichts tun, außer ein Textfeld angezeigt werden und es 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 __name__ == "__main__": 
    main() 
+1

Sie können das Argument END (oder "end") angeben, anstatt die Länge der Daten zu berechnen. Da du sagst, dass es nicht funktioniert hat, aber nicht "nicht funktioniert" definiert hat (zB: hast du einen Fehler erhalten, oder ist es im Stillen fehlgeschlagen?), Meine Vermutung ist, dass du ein unqualifiziertes "END" benutzt hast. Versuchen Sie stattdessen "Tkinter.END". Wenn ich das im obigen Code verwende, funktioniert es gut. –

+0

@Bryan: Ah, ich habe nur END, nicht Tkinter.END (das Tutorial verwendete 'from ... import' anstatt nur zu importieren). Vielen Dank! Das Update ist im Code enthalten. – GreenMatt

+0

Ich möchte mit der Schaltfläche 2 Aktionen gleichzeitig ausführen. der erste ist eine zufällige Aktion durchzuführen und der zweite ist, den Eintrag zu löschen – Dan

2

Ich bin über Ihre Frage unklar. Von http://effbot.org/tkinterbook/entry.htm#patterns, es scheint, müssen Sie nur eine Zuweisung tun, nachdem Sie das Löschen aufgerufen haben. Verwenden Sie die Einfügemethode, um dem Widget Eintragstext hinzuzufügen. Um den aktuellen Text zu ersetzen, können Sie löschen aufrufen, bevor Sie den neuen Text einfügen.

e = Entry(master) 
e.pack() 

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

Können Sie etwas mehr Code posten?

+0

Die Antwort lösen „es Sie nur einen Auftrag tun müssen, scheint, nachdem Sie das Löschen als“ in keiner Weise beantwortet die Frage: „Wie löschen den Eintrag Widget“. –

+0

Das hat mir sehr geholfen: e.delete (0, END), danke Charles. –

4

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

Statt real.delete(), rufen .delete() auf dem Eintrag Widget selbst:

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) ist die richtige Antwort, unter der Annahme, dass ent den Eintrag Widget eine richtige Referenz. Wenn Sie den Fehler erhalten, den Sie sagen, haben Sie einen Fehler in Ihrem Code. Sie müssen uns den Code zeigen, wenn Sie den Fehler nicht selbst entdecken können.

-6

Versuchen mit diesem:

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

Bitte beachten Sie, dass Sie mindestens ifo hinzufügen, um den Code zu verstehen –

+3

Nein, das wird absolut nicht funktionieren. Dies löscht den Bildschirm, kein Widget in einem Fenster. –

+0

Das hat nichts mit der Frage zu tun. – cpburnz

0

Zunächst einmal sicher, dass der Text aktiviert ist, dann Ihre Tags löschen und dann den Inhalt.

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

0

Sie müssen fortfahren mit ent.delete(0,"end") anstelle von 'END', verwenden Sie 'Ende' in 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 gilt Ihr Problem