frame leeren / labels mit StringVar entfernen

Fragen zu Tkinter.
Antworten
Trollmops
User
Beiträge: 13
Registriert: Dienstag 15. Mai 2012, 11:47

Hallo, meine frage ist, wie ich einen frame einfach leeren kann.
er ist mit in ein canvas element eingebettet um eine scrollbar zu erhalten:

Code: Alles auswählen

canvas = tk.Canvas(root, borderwidth=0)
frame = tk.Frame(canvas,height=500)
vsb = tk.Scrollbar(root, orient="vertical", command=canvas.yview)
canvas.configure(yscrollcommand=vsb.set)

vsb.pack(side="right", fill="y")
canvas.pack(side="left", fill="both", expand=True)
canvas.create_window((4,4), window=frame, anchor="nw", tags="self.frame")

frame.bind("<Configure>", OnFrameConfigure)

def OnFrameConfigure(event):
        canvas.configure(scrollregion=canvas.bbox("all"))
weshalb ich ihn ungerne löschen möchte. stattdessen würde ich ihn gerne leeren.
ich erstelle einige labels die mit StringVars verknüpft sind.

Code: Alles auswählen

labelliste=[]
meinText=tk.StringVar()
meinText("hallo python forum")

meinLabel=Label(frame,textvariable=meinText)
meinLabel.grid(row=0,column=0)
labelliste.append(meinLabel)

um ein beispiel anzubringen.

um diese zu löschen (und da mit kein einfacherer weg eingefallen ist, für vorschläge bin ich dankbar! meine liste ist lang...)
wollte ich wiefolgt vorgehen:

Code: Alles auswählen

for element in labelliste:
     element.destroy()
denn der kram soll weg. allerdings bekomme ich einen fehler

AttributeError: StringVar instance has no attribute 'destroy'

buttons hingehen lassen sich auf diese weise problemlos löschen.

das gleiche wenn ich grid_forget() o.ä. nutze.
ich kann stringvar einfach auf "" setzen via

Code: Alles auswählen

for element in labelliste:
     element.set("")
was alle meine labels unsichtbar macht, aber auch nur weil sie sich farblich und ohne rand nicht vom hintergrund abheben. die labels sind immernoch da, und auch die scrollbar bleibt entsprechend lang. wird meine labelliste kürzer kann ich viel weiter als nötig nach unten scrollen und finde da eh nur leere fläche. unschön.


hatte jemand bereits ähnliche probleme, oder hat eine bessere alternative, oder eine lösung für mich?

ich wäre euch sehr verbunden :)

mit besten grüßen, mops
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi TrollMops

Ich bekomme deine Fehlermeldung nicht. Hier etwas zum pröbeln:

Code: Alles auswählen

try:
    #~~ For Python 2.x
    import Tkinter as tk
except ImportError:
    #~~ For Python 3.x
    import tkinter as tk

def OnFrameConfigure(event):
        canvas.configure(scrollregion=canvas.bbox("all"))

root = tk.Tk()

canvas = tk.Canvas(root, borderwidth=0)
frame = tk.Frame(canvas,height=500)
vsb = tk.Scrollbar(root, orient="vertical", command=canvas.yview)
canvas.configure(yscrollcommand=vsb.set)

vsb.pack(side="right", fill="y")
canvas.pack(side="left", fill="both", expand=True)
frame.bind("<Configure>", OnFrameConfigure)
canvas.create_window((4,4), window=frame, anchor="nw", tags="self.frame")

labelliste=[]

meinText=tk.StringVar()
meinText.set("hallo python forum")
meinLabel = tk.Label(frame, textvariable=meinText, bd=1, relief='raised')
meinLabel.grid(row=0,column=0)
labelliste.append(meinLabel)

meinText_02=tk.StringVar()
meinText.set("Good day mates!")
meinLabel = tk.Label(frame, textvariable=meinText, bd=1, relief='raised')
meinLabel.grid(row=1,column=0)
labelliste.append(meinLabel)

#~~ Bestehende Variante: Loescht alle in der Liste vorhandenen Labels
for element in labelliste:
    element.destroy()

#~~ Weitere Variante: Entfernt alle auf dem Frame platzierten Widgets
#for child in frame.winfo_children():
#    child.destroy()

#~~ Loescht das Canvas-window Objekt und das Frame mit allen darauf platzierten
#   Widgets
#canvas.delete("self.frame") 
      
root.mainloop()
Gruss wuf :wink:
Take it easy Mates!
Trollmops
User
Beiträge: 13
Registriert: Dienstag 15. Mai 2012, 11:47

Ok, dann werd ich morgen nochmal gucken woher der fehler kommen könnte. Ich fands auch komisch, vllt liegts am OS? Das ist das erste ma, dass ich auf win schreib. (VM, win7 x64, py2.7)

Die vorletzte lösung sieht interessant aus, die werd ich auch probieren.

Vielen dank, ich werds testen und melde mich morgen nochmal.

Gruß, mops :)
Trollmops
User
Beiträge: 13
Registriert: Dienstag 15. Mai 2012, 11:47

*facepalm*

also, mein problem war, dass ich tatsächlich die listen durcheinandergebracht habe, und auf die stringvars "gezielt" habe.

(ich habe liste in liste in dictionary genutzt, war etwas chaotisch)

also mit den labels funzt es auch problemlos, aber wie gesagt, deine lösung

Code: Alles auswählen

for child in frame.winfo_children():
    child.destroy()
ist genau das was ich gesucht habe, vielen dank dafür!


beste grüße, mops
Antworten