wx.StaticText gibt gibt Speicher nicht mehr frei

Plattformunabhängige GUIs mit wxWidgets.
Antworten
jgre
User
Beiträge: 6
Registriert: Donnerstag 10. Januar 2008, 17:16
Kontaktdaten:

Hallo, ich bin neu hier!

Ich habe bei uns in der Firma die Augabe bekommen so eine Art log-information graphisch mit wxpython darzustellen.
Da kommt immer wieder die gleiche Anzahl an Zeile über eine Schnittstelle und die sollte ich eben in einem Fenster untereinander darstellen.

Gleichzeitig sind das auch meine Ersten Erfahrungen mit wxpython

Mein Problem ist jetzt, das diese kleine Programm bei jedem Aktualisierungsvorgang (also bei jedem mal einlesen und darstellen des Textes) mehr und mehr Speicher UND Rechnnleichtung benötigt.

Das ganze hab ich mal auf die unten stehende Methode eingegrenzt. Wenn diese nicht aufgerufen wird, oder genauer, wenn ich StaticText nicht benutzte bleibt alles im ruhigen Bereich.

Meine Frage ist nun, wie ich den Speicher den mir StaticText anscheinend beschreibt, wieder frei bekommen, bzw. ob ich nicht KOMPLETTEN Noob Code geschrieben habe.

Dieser Methode wird alle Sekunden aufgerufen (mittles EVT_TIMER ect.)

Könnte man sicher besser schreiben, aber ich hab das zum testen mal so geschrieben.

Code: Alles auswählen

def drawText(self, label, y_base, x_pos, increment):
    self.SetBackgroundColour("lightgray")
    text = []
    max = len(label)
    for x in range(max):
      text = text + [wx.StaticText(self.panel, -1)]
      text[x].SetLabel(label[x])
      y_pos = y_base + (x + 1) * increment
      text[x].MoveXY(x_pos, y_pos)
Ich muss dazusagen, das ichpython selbst erst seit 2 Wochen programmiere. Also habt bitte Nachsicht
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

Nichts für ungut, aber du hast "Noob-Code" geschrieben.

Du erzeugst alle paar Sekunden ein komplett neues StaticText-Widget und speicherst es in einer Liste, die mit der Zeit immer voller wird. Python gibt den von einem Objekt belegten Speicher erst wieder frei, wenn es keine Referenzen auf dieses Objekt mehr gibt. So lange du die StaticTexts in einer Liste hälst, hälst du auch Referenzen, ergo kann Python da nichts freigeben und dir läuft der Speicher voll.

Sinnvoll wäre ein einziges, außerhalb der Schleife erzeugtes StaticText, das dann nur noch regelmäßig aktualisiert wird.

EDIT: Ok, lesen müßte man können. Du willst also für jede Zeile ein eigenes Widget. Das ist in Ordnung, aber der springende Punkt ist halt, daß du sie außerhalb der Schleife erzeugen mußt.

EDIT2: Äh ... ich gehe besser schlafen ...
jgre
User
Beiträge: 6
Registriert: Donnerstag 10. Januar 2008, 17:16
Kontaktdaten:

Noob-Code ... ich weis!!! :oops:

Ich, in meiner Naivität, dachte das es nur so funktioniert

Aber wenn ich eine Liste von Texten habe und diese immer im gleich anzeigen will, ist eine schleife doch die einzige Lösung?

Was ich will ist:
Eine Liste mit Texteinträgen sekündlich in ein Fenster zu schreiben.
Immer an die gleiche Posititon
-------------------------------
|Ergebnis 1: Text blabla1 |
|Ergebnis 2: Text blabla2 |
|Ergebnis 3: Text blabla3 |
|Ergebnis X: Text blablax |
--------------------------------
wobei ich die Text blabla Seite immer wieder neu schreiben lassen. Aber anscheindend erzeuge ich das Ding immer wieder neu.
Wie aktualisiere ich das Ganze einfach nur. (Mir fehlt ganz einfachdas Know-How)
gras78ix
User
Beiträge: 9
Registriert: Samstag 4. August 2007, 11:35

also für die Darstellung einer Liste von Texten ist eigentlich das schlimmste und unsinnigste einen statictext zu benutzen - ich kann nur empfehlen ein skrollbares textfenster zu nehmen und dort eintrag für eintrag reinzuschreiben
jgre
User
Beiträge: 6
Registriert: Donnerstag 10. Januar 2008, 17:16
Kontaktdaten:

Ok, daran hab ich auch gedacht, aber die Werte werden doch immer wieder überschrieben. Also ich hab da immer eine Anzeige von ... 12 Werte, welche ich eben refresh.
jgre
User
Beiträge: 6
Registriert: Donnerstag 10. Januar 2008, 17:16
Kontaktdaten:

Wie auch immer. Danke Leute!
Hab es nun umgeschrieben und es läuft problemlos :)))
Antworten