2012-09-11 16 views

Antwort

42

Sie können pack_forget aufrufen, um ein Widget zu entfernen (wenn Sie pack verwenden, um es dem Fenster hinzuzufügen).

Beispiel:

from tkinter import * 

root = Tk() 

b = Button(root, text="Delete me", command=lambda: b.pack_forget()) 
b.pack() 

root.mainloop() 

Wenn Sie pack_forget verwenden, können Sie später zeigen die wieder Widget pack wieder aufrufen. Wenn Sie es dauerhaft löschen möchten, rufen Sie destroy auf dem Widget (dann können Sie es nicht erneut hinzufügen).

Wenn Sie die grid Methode verwenden, können Sie grid_forget oder grid_remove-verstecken das Widget verwenden.

+6

@TheBeardedBerry helfen: bewusst sein, dass 'pack_forget' Widgets nicht löschen, sie nur aus dem Blickfeld entfernt. Sie werden weiterhin existieren und möglicherweise einen Speicherverlust verursachen, wenn Sie Widgets neu erstellen, ohne sie zu zerstören. –

+3

Wenn ich einen Frame "pack_forget" und dann lösche, löscht er auch die untergeordneten Widgets oder sollte ich sie einzeln löschen? – Marco83

+0

kannst du etwas wie 'place_forget' anstelle von pack machen? – Stegosaurus

-1

Ich fand, dass, wenn das Widget Teil einer Funktion ist und die grid_remove Teil einer anderen Funktion ist, es die Beschriftung nicht entfernt. In diesem Beispiel ...

def somefunction(self): 
    Label(self, text=" ").grid(row = 0, column = 0) 
    self.text_ent = Entry(self) 
    self.text_ent.grid(row = 1, column = 0) 
def someotherfunction(self): 
    somefunction.text_ent.grid_remove() 

... es gibt keine gültige Möglichkeit, das Etikett zu entfernen.

Die einzige Lösung, die ich finden konnte ist das Label einen Namen zu geben und machen es global:

def somefunction(self): 
    global label 
    label = Label(self, text=" ") 
    label.grid(row = 0, column = 0) 
    self.text_ent = Entry(self) 
    self.text_ent.grid(row = 1, column = 0) 
def someotherfunction(self): 
    global label 
    somefunction.text_ent.grid_remove() 
    label.grid_remove() 

Als ich in dieses Problem lief eine Klasse beteiligt war, eine Funktion in der Klasse und ein Wesen nicht , also bin ich mir nicht sicher, ob die global label Zeilen wirklich in den oben genannten benötigt werden.

+1

Die Tatsache, dass es keine Möglichkeit gibt, das erste Etikett zu entfernen, das Sie erstellen, hängt nicht damit zusammen, dass Sie es in einer Funktion erstellen und es in einer anderen entfernen, es ist einfach, dass Sie versagen an einer Referenz festhalten. Dies ist keine Tkinter-Sache, es ist eine Programmier-Sache - um auf ein Objekt einzuwirken, müssen Sie einen Verweis auf das Objekt haben. In Ihrem zweiten Beispiel müssen Sie keine globale Variable verwenden. Ordnen Sie es stattdessen "self" zu, genau wie Sie das Eingabe-Widget tun. –

6

Ein Weg, wie Sie es tun können, ist, die Slave-Liste aus dem Rahmen zu holen, der gelöscht werden muss, und sie nach Ihren Bedürfnissen zu zerstören oder zu "verstecken". Um einen klaren Rahmen zu erhalten können Sie es wie folgt tun:

from tkinter import * 

root = Tk() 

def clear(): 
    list = root.grid_slaves() 
    for l in list: 
     l.destroy() 

Label(root,text='Hello World!').grid(row=0) 
Button(root,text='Clear',command=clear).grid(row=1) 

root.mainloop() 

sollten Sie rufen grid_slaves(), pack_slaves() oder slaves() abhängig von dem Verfahren verwendet man das Widget mit dem Rahmen hinzuzufügen.

0

Heute lerne ich einige einfache und gute Click-Event-Behandlung mit Tkinter GUI-Bibliothek in Python3, die ich in diesem Thread teilen möchte.

from tkinter import * 

cnt = 0 


def MsgClick(event): 
    children = root.winfo_children() 
    for child in children: 
     # print("type of widget is : " + str(type(child))) 
     if str(type(child)) == "<class 'tkinter.Message'>": 
      # print("Here Message widget will destroy") 
      child.destroy() 
      return 

def MsgMotion(event): 
    print("Mouse position: (%s %s)" % (event.x, event.y)) 
    return 


def ButtonClick(event): 
    global cnt, msg 
    cnt += 1 
    msg = Message(root, text="you just clicked the button..." + str(cnt) + "...time...") 
    msg.config(bg='lightgreen', font=('times', 24, 'italic')) 
    msg.bind("<Button-1>", MsgClick) 
    msg.bind("<Motion>", MsgMotion) 
    msg.pack() 
    #print(type(msg)) tkinter.Message 


def ButtonDoubleClick(event): 
    import sys; sys.exit() 


root = Tk() 

root.title("My First GUI App in Python") 
root.minsize(width=300, height=300) 
root.maxsize(width=400, height=350) 
button = Button(
    root, text="Click Me!", width=40, height=3 
) 
button.pack() 
button.bind("<Button-1>", ButtonClick) 
button.bind("<Double-1>", ButtonDoubleClick) 

root.mainloop() 

Hoffen, dass es jemand ...

+0

soll dies eine Antwort auf die Frage sein? Wenn nicht, bitte entfernen Sie es. Wenn dies der Fall ist, müssen Sie klären, wie sich dies auf das Löschen eines Widgets bezieht. –

+0

danke @BryanOakley für mich für python3 zu motivieren. : D – ArifMustafa

Verwandte Themen