2012-03-27 15 views
4

Ich lehre mich seit ein paar Monaten selbst Python und habe jetzt einige GUI-Techniken gelernt.Python tkinter .pack/.pack_forget Speicherproblem

Ich schrieb dieses einfache Skript basierend auf einem pack_remove Beispiel, das ich in einem Buch gefunden habe. Mein Skript zeigt einfach lokale und UTC-Zeit jede Sekunde an. Zugegeben, der einzige Unterschied ist die Stunde, ich möchte trotzdem jede Sekunde neu anzeigen.

Das Skript funktioniert, aber mein RAM steigt ständig mit jeder Zeitanzeige. Ich beginne mit ungefähr 4 MB, dann nach 2 Stunden oder so verwendet das Skript 25 MB. Das macht für mich einen Sinn, aber ich war neugierig, ob es eine Möglichkeit gibt, jede Sekunde neue Zeiten anzuzeigen, aber den Speicherverbrauch einer solchen einfachen Uhranzeige zu reduzieren.

Oder verwende ich eine ineffiziente Technik, um Daten in einer GUI mit einer hohen Frequenz wieder anzuzeigen?

Hier ist mein Code:

from tkinter import * 
import time 

class TimeDisplay(Frame): 
    def __init__(self,msecs = 1000): 
     Frame.__init__(self) 
     self.msecs = msecs 
     self.pack() 
     utc_time = Label(self, text='') 
     utc_time.pack() 
     cst_time = Label(self, text='') 
     cst_time.pack() 
     self.utc_time = utc_time 
     self.cst_time = cst_time 
     self.repeater() 

    def repeater(self): 
     self.utc_time.pack_forget() 
     self.cst_time.pack_forget() 
     self.utc_time = Label(self, text= 'UTC: ' + time.strftime('%Y/%m/%d %H:%M:%S',time.gmtime())) 
     self.utc_time.pack() 
     self.utc_time.config(bg='navy',fg='white') 
     self.cst_time = Label(self, text= 'CST: ' + time.strftime('%Y/%m/%d %H:%M:%S',time.localtime())) 
     self.cst_time.pack() 
     self.cst_time.config(bg='navy',fg='white') 
     self.after(self.msecs, self.repeater)   


if __name__ == '__main__': TimeDisplay(msecs=1000).mainloop()  

Vielen Dank im Voraus

Antwort

1

pack_forget nichts zerstören wird, es macht es nicht sichtbar. Dies ist eine GUI-Version eines Speicherlecks - Sie erstellen Objekte, ohne sie zu zerstören.

Also die erste Lektion zu lernen ist, dass Sie ein Widget zerstören sollten, wenn Sie damit fertig sind.

Die wichtigere Lektion zu lernen ist, dass Sie das gleiche Widget nicht immer wieder zerstören und neu erstellen müssen. Sie können den Text ändern, der mit der Methode configure angezeigt wird. Zum Beispiel:

self.utc_time.configure(text="...") 

Dies wird Ihr Programm nicht verwendet keine zusätzlichen Speicher, macht und sogar verwenden (unmerklich) weniger CPU.

0

Um Speicher frei widget eigentlich sollten Sie auch nennen es .Destroy() -Methode. Dies verhindert in Ihrem Fall Speicherlecks.

jedoch eine effizientere Art und Weise die Dinge zu implementieren, ist auf String-Variable mit Label-Widget wie folgt gefunden:

v = StringVar() 
Label(master, textvariable=v).pack() 
v.set("New Text!") 

siehe http://effbot.org/tkinterbook/label.htm Referenz

+0

streng genommen müssen Sie keine 'textvariable' verwenden. Das bedeutet zusätzlichen Aufwand, wenn Sie nur das Textattribut neu konfigurieren müssen. –