Ich habe eine Liste von Tkinter Widgets, die ich dynamisch ändern möchte.Wie Tkinter Widgets aus einem Fenster löschen?
Wie kann ich die Widgets vollständig aus meinem Fenster löschen?
Ich habe eine Liste von Tkinter Widgets, die ich dynamisch ändern möchte.Wie Tkinter Widgets aus einem Fenster löschen?
Wie kann ich die Widgets vollständig aus meinem Fenster löschen?
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.
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.
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. –
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.
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 ...
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. –
danke @BryanOakley für mich für python3 zu motivieren. : D – ArifMustafa
@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. –
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
kannst du etwas wie 'place_forget' anstelle von pack machen? – Stegosaurus