Speicherfreigabe unter canvas

Fragen zu Tkinter.
Antworten
rashury
User
Beiträge: 16
Registriert: Dienstag 19. Januar 2010, 13:09
Wohnort: Wien
Kontaktdaten:

Hallo Leute,

ich versuche ein grafisches Programm unter Python zu schreiben, das die Messwerte seriell einliest, und diese grafisch darstellt, das Programm hat einen Fehler beim Ausführen, dass verwendeten Speicher durch meine Applikation immer vergrössert wird, bis das Programm abstürtzt (nach 10 Minuten).
Der Ausgabe der Kurve auf Bildschrim läuft so, dass die Messwerte im _Buffer abgespeichert sind, und _AidVar nur Steuervariable beinhaltet, und die Methode Cerate_line und delete verwendet wird:

Code: Alles auswählen

def drawCurve (self , _AidVar , _Buffer):
  
  
    self._f[i].create_rectangle (0 , 0 , 1100 , 110 , width=0 , fill = 'white')                                       
    self._f[i].delete (ALL) ' um die Fläche zum Zeichen Suaber bereit stellen.


     self._f[i].create_line (self._Buffer[i][0][ii] , self._Buffer[i][1][ii] /(-10) + 80 , self._Buffer[i][0][ii+1] , self._Buffer[i][1][ii+1] /(-10) + 80,  fill = 'green') ' Zeichnen der Kurve.

       for REST_EINTRAG in self._f[i].find_all (): ' löschen im Speicher
        self._f[i].delete (REST_EINTRAG)

       
   self._f[i].update ()
###############<End Of Function.>###################
Trotz Löschen des Speichers, wird aber den Speichebereich sprengen, wer kann sagen, warum?

Edit (BlackJack): Quelltext in Code-Tags gesetzt.
Hallo Leute,
BlackJack

Also ich kann sagen, dass das da kein gültiges Python ist und ganz bestimmt nicht der Quelltext mit dem Du Probleme hast. Also kann man auch schlecht sagen woran es liegt.
rashury
User
Beiträge: 16
Registriert: Dienstag 19. Januar 2010, 13:09
Wohnort: Wien
Kontaktdaten:

Hallo Jack,

danke für deine Antwort, ich kpoiere unter die class mit allen Komentarzeilen:

Code: Alles auswählen

 ################<Beginning of Function:>#########
 ###### <Autor: >
 ###### <Description:>   
 def drawCurve (self , _AidVar , _Buffer):
  
  for i in range (self._AidVar[0][1]): 
   if (self._AidVar[0][3] < self._AidVar[0][2] or self._AidVar[0][3] == self._AidVar[0][2]):
    #self.delCan ()
    #for REST_EINTRAG in self._f[i].find_all ():
     #self._f[i].delete (REST_EINTRAG)
    self._f[i].create_rectangle (0 , 0 , 1100 , 110 , width=0 , fill = 'white')                                       
    self._f[i].delete (ALL)
    self._f[i].delete(*self._f[i].find_all())

    #self._f[1].delete (ALL)
    #self._f[2].delete (ALL)
    for REST_EINTRAG in self._f[i].find_all ():
     print  '->' , self._f[i].find_all ()

    for ii in range (len(self._Buffer[i][0]) - 1):
     if (len (self._Buffer[i][0]) > 0):
      if (self._Buffer[i][0][ii] < self._Buffer[i][0][ii+1]): # or self._Buffer[i][0][ii] > self._Buffer[i][0][ii+1]):
       z = 0
       #print '' #  self._Buffer[i][0][ii] 
       #Canvas.Line (self._f[i] , self._Buffer[i][0][ii] , self._Buffer[i][1][ii] /(-10) + 50 , self._Buffer[i][0][ii+1] , self._Buffer[i][1][ii+1] /(-10) + 50,  fill = 'green')       
       x = self._f[i].create_line (self._Buffer[i][0][ii] , self._Buffer[i][1][ii] /(-10) + 80 , self._Buffer[i][0][ii+1] , self._Buffer[i][1][ii+1] /(-10) + 80,  fill = 'green')
       #self._f[i].delete (x)
       for REST_EINTRAG in self._f[i].find_all ():
        self._f[i].delete (REST_EINTRAG)

       #print i , x
       #self._f[i].delete('ALL')
       #__f.append(x)
       #for iii in range (len (__f)):
        #self._f[i].delete (__f[iii])
       
       #self._f[i].delete (x)
       #z += 1
       #print z
   self._f[i].update ()
 ###############<End Of Function.>###################
also, noch einmal zum Fehler, wenn ich den Befehl, ceate_line unter Komentar stellen, dann kommt es zu keinem Speicherveressen durch das Programm,
denkst Du, wo kann Fehler liegen?

Edit (BlackJack): Quelltext in Code-Tags gesetzt.
Hallo Leute,
BlackJack

Also das ist mir alles zu wirr und unübersichtlich. Das sollte mal dringend von den ganzen Kommentaren befreit werden, dann wären besser, aussagekräftigeren Namen nicht schlecht, und statt mit `i`, `ii` oder gar `iii` zu hantieren, sollte man wo es geht in den Schleifen direkt über die Objekte iterieren, statt dieser exzessiven Indexerei.

Werden `_AidVar` und `_Buffer` überhaupt verwendet?
rashury
User
Beiträge: 16
Registriert: Dienstag 19. Januar 2010, 13:09
Wohnort: Wien
Kontaktdaten:

Hallo Jack,

ja, logisch, ich verstehe dich, ich versuche das Programm so zu ändern, dass das Problem eindeutiger zur Diskussion steht, ich bin dabei das zu machen, ich liefere das geändertes Programm demnächst (Wahrscheinlich morgen),

Gruß,
rashury.
Hallo Leute,
rashury
User
Beiträge: 16
Registriert: Dienstag 19. Januar 2010, 13:09
Wohnort: Wien
Kontaktdaten:

Hallo Jack,

ich habe die Ausgabefunktion aud Bilfschirm vereinfacht, also nur eine kürze Erklärung dazu:
Die Messwerte werden aufdie Liste "_ Buffer" abgespeichert, und richtig ausgegeben,
ich verstehe es nicht, wieso wird die Speicherbelegung immer grösser und grösser, bis es abstützt.
Also Bitte, die Auasgabefunktion schaut wie folgt, aus:

################<Beginning of Function:>#########
###### <Autor: >
###### <Description:>
def drawCurve (self , _AidVar , _Buffer):

for i in range (3):
self._f.delete (ALL)
for ii in range (len(self._Buffer[0]) - 1):
self._f.create_line (self._Buffer[0][ii] , self._Buffer[1][ii] /(-10) + 80 , self._Buffer[0][ii+1] , self._Buffer[1][ii+1] /(-10) + 80, fill = 'green')
self._f.update ()
###############<End Of Function.>###################

Gruß und ein schönes Wochen Ende wünsche ich Dir,
Hallo Leute,
rashury
User
Beiträge: 16
Registriert: Dienstag 19. Januar 2010, 13:09
Wohnort: Wien
Kontaktdaten:

Hallo,

ich habe folgendes getestet:
ich löschte self._f.delete () raus, so ging den Speicher schneller voll,
ich löschte self.f.update () raus, so blieb den Speicher konstant, abezeichnete nicht.
Also, Bitte: Was ist im Programm falsch? wer kann helfen ? wer hat :idea:
Hallo Leute,
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo rashury
rashury hat geschrieben:################<Beginning of Function:>#########
###### <Autor: >
###### <Description:>
def drawCurve (self , _AidVar , _Buffer):

for i in range (3):
self._f.delete (ALL)
for ii in range (len(self._Buffer[0]) - 1):
self._f.create_line (self._Buffer[0][ii] , self._Buffer[1][ii] /(-10) + 80 , self._Buffer[0][ii+1] , self._Buffer[1][ii+1] /(-10) + 80, fill = 'green')
self._f.update ()
###############<End Of Function.>###################


Ich nehme an dein Python-Code sollte wie folgt aussehen:

Code: Alles auswählen

################<Beginning of Function:>#########
###### <Autor: >
###### <Description:>
def drawCurve (self , _AidVar , _Buffer):

for i in range (3):
    self._f[i].delete (ALL)
        for ii in range (len(self._Buffer[i][0]) - 1):
            self._f[i].create_line (self._Buffer[i][0][ii] ,
            self._Buffer[i][1][ii] /(-10) + 80 , self._Buffer[i][0][ii+1] ,
            self._Buffer[i][1][ii+1] /(-10) + 80, fill = 'green')
    self._f[i].update ()
###############<End Of Function.>################### 
Das kannst du nur erreichen, wenn du dein hier präsentierte Python-Code in sogenannte Python-Code-Tags setzt.

Kannst du einmal versuchen dein Python-Code mit Python-Tags zu versehen und dann hier in diesem Thread zu zeigen.
Du musst hierfür im Forum-Editor die Schaltfläche 'Python' aktivieren. Dann kopiere dein Python-Code dazu. Abschliessend musst die die Schaltfläche 'Python' nochmals aktivieren. Kontrolliere mit der Schaltfläche 'Vorschau' ob jetzt dein Python-Code als solcher präsentiert wird!

Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo rashury

Kannst du hier für deine übergebenen Parameter '_AidVar' und '_Buffer' an die Methode 'drawCurve' ein kleiner Datensatz zur Verfügung stellen damit einer diese Methode ohne selber Phantasiedaten generieren zu müssen austesten kann?

Gruss wuf :wink:
Take it easy Mates!
rashury
User
Beiträge: 16
Registriert: Dienstag 19. Januar 2010, 13:09
Wohnort: Wien
Kontaktdaten:

Hallo Allzusammen,

ich habe zum Tesen aus der Methode "drawCurve" 3 Varianten erzeugt "jede hat am Anfang ein '_'- Zeichen,"

Das ganze Programm:
import os
import string
import tty

import Tkinter
import Canvas
import math
import sys
from Tkconstants import *
from Tkinter import tkinter

class startEKG ():

_Buttons = ['Start (Stop):', 'Bildschirmabzug.' , 'Berechnung.', 'Beenden & Ausstieg.']
Channals = ['channal_1' , 'channal_2', 'channal_3' , 'channal_4' , 'channal_5' , 'channal_6' , 'channal_7' , 'channal_8' , 'channal_9' , 'channal_10' , 'channal_11' , 'channal_12']
_AidVar = [ [[]], [[]], [[]], [[]], [[]], [[]], [[]], [[]], [[]], [[]], [[]], [[]], [[]]]
_Buffer = [ [[],[]] , [[],[]] , [[],[]] , [[],[]] , [[],[]] , [[],[]] , [[],[]] , [[],[]] , [[],[]] , [[],[]] , [[],[]] , [[],[]] ]


for i in range (len (_AidVar[0])):
x = _AidVar[0].pop()

_AidVar[0].append(1) # Akteles Kanal.
_AidVar[0].append(3) # Kanalanzahl.
_AidVar[0].append(3600) # Maximale Pixlanzahl. Oder maximale Messzeit.
_AidVar[0].append(0) # Aktuele MP- Anzahl.
_AidVar[0].append(150) # X0.

fobj = 0
lint = []
jj = 0
WinName = ''
_f = [0,0,0,0,0,0,]

k = 0

################<Beginning of Function:>############
###### <Autor: >
###### <Description:>
def __init__ (self , n ):#master = None):
#print '__init__'
self.k = 0
master = None
self.WinName = n
self.Init_Pointer(self._AidVar)
fobj = open('/dev/ttyUSB0', "r")
self.jj = 0
self._f[0] = Tkinter.Canvas(master, relief = RIDGE, bd = 2, bg = "white", width = 1100, height = 100)
self._f[0].pack()
self._f[1] = Tkinter.Canvas(master, relief = RIDGE, bd = 2, bg = "white", width = 1100, height = 100)
self._f[1].pack()
self._f[2] = Tkinter.Canvas(master, relief = RIDGE, bd = 2, bg = "white", width = 1100, height = 100)
self._f[2].pack()

self.button = Tkinter.Button(master, text = " Run ", command = self.startDataProcessing)
self.button.pack(side = BOTTOM, pady = 4)
###############<End Of Function.>###################

################<Beginning of Function:>############
###### <Autor: >
###### <Description:>
def startDataProcessing (self):
#print 'startDataProcessing'
self.fobj = open ('/dev/ttyUSB0', "r")
self.WinName.createfilehandler (self.fobj , tkinter.READABLE , self.callback)
###############<End Of Function.>###################

################<Beginning of Function:>############
###### <Autor: >
###### <Description:>
def callback(self , a , b):
#print 'callback'
line = []
lline = []

line = self.fobj.readline ()
lline = line.split ()
if (len(lline) == 2):
self.lint = [string.atoi(lline[j]) for j in (0,1)]
self.lint.append(self.lint[1] - self.lint[0])
#print "Messdaten aus der seriellen Schnittstelle : ", self.lint
self.dataProcessing(self._AidVar , self.jj , self.lint)
#print 'CALLBACK LAENGE' , len (line ) , len (lline ) , len (self.lint)
###############<End Of Function.>###################

################<Beginning of Function:>############
###### <Autor: >
###### <Description:>
def Init_Pointer(self , _AidVar):
rc = 0
p = 0
a = self._AidVar[0][1] + 1
for i in range (1, self._AidVar[0][1] +1):
for ii in range (len (self._AidVar)):
x = self._AidVar.pop()

self._AidVar[0][0] = 1
for i in range (1, self._AidVar[0][1] + 1):
for ii in range (5):
self._AidVar.append(0)
#print 'iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii' , self._AidVar
###############<End Of Function.>###################

################<Beginning of Function:>############
###### <Autor: >
###### <Description:>
def dataProcessing(self, _AidVar , jj , lint):
#print "DATAPROCESSING"
rc = 0
rc = self.Save_MP_p_to_Buffer (self._AidVar , self.jj)
rc = self.Save_MP_p_to_Buffer (self._AidVar , self.lint[0])

rc = self.Save_MP_p_to_Buffer (self._AidVar , self.jj)
rc = self.Save_MP_p_to_Buffer (self._AidVar , self.lint[1])

rc = self.Save_MP_p_to_Buffer (self._AidVar , self.jj)
rc = self.Save_MP_p_to_Buffer (self._AidVar , self.lint[2])
self.jj = self.jj + 1

if (rc == 1):
#print 'OKKKKKKKKKKKKk'
rc = self.Save_MP_to_Buffer (self._Buffer , self._AidVar)
self.drawCurve(self._AidVar , self._Buffer)
###############<End Of Function.>###################

################<Beginning of Function:>###############
###### <Autor: >
###### <Description:>
def Save_MP_p_to_Buffer (self , _AidVar , value):
#print "SAVE_MP_P_TO_BUFFER"
rc = 0
eins = self._AidVar[0][0]
EINS = self._AidVar[eins]

#print self._AidVar[0][0] , self._AidVar[0][1]
#print EINS[0] , EINS[2]
#print self._AidVar[self._AidVar[0][0]][0] , self._AidVar[self._AidVar[0][0]][2]

if (EINS[0] == 0 and EINS[2] == 0): # Keinen Timer- Eintrag.
#print 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz'
EINS[0] = 1
EINS[1] = value # Timer.

if (EINS[0] == 1 and EINS[2] == 0 and EINS[4] == 'Timer'): # Keinen Counter- Eintrag.
EINS[2] = 1
EINS[3] = value # Counter.

if (EINS[0] == 1 and EINS[2] == 0): # Keinen Kanal- Eintrag.
EINS[4] = 'Timer'
if (EINS[0] == 1 and EINS[2] == 1 and EINS[4] == 'Timer'): # Keinen Kanal- Eintrag.
self._AidVar[0][0] += 1 # Timer und Spannung Empfangen.
EINS[4] = 'Kanal'

#print self._AidVar[0][0] , self._AidVar[0][1]
if (self._AidVar[0][0] -1 == self._AidVar[0][1] and EINS[4] == 'Kanal'):
rc = 1

return (rc)
###############<End Of Function.>###################

################<Beginning of Function:>#########
###### <Autor: >
###### <Description:>
def ShiftList (self , x= [] , y=[]):
#print "ShiftList", self.k
#print 'x vor : ' , x
#self.k += 1
p = []

p.append(y)
for i in range (len (x)):
p.append (x)

for i in range (len (x)):
a = x.pop ()

for i in range (len (p)):
x.append(p)

#p.append(y)
#p = p + x
#x = p
#print 'x nach : ' , x
###############<End Of Function.>###################

################<Beginning of Function:>#########
###### <Autor: >
###### <Description:>
def TransfrmList(self , x , y):
#print 'TransfrmList' , self.k
#self.k += 1
p = []

p.append(y)
for i in range ( len(x) -1): # for i in range (1 , len (x)):
p.append (x)

for i in range(len(x)):
a = x.pop()
#x = null
for i in range (len (p)):
x.append(p)
###############<End Of Function.>###################

################<Beginning of Function:>#########
###### <Autor: >
###### <Description:>
def Save_MP_to_Buffer (self , _Buffer , _AidVar):#_Buffer , _AidVar):

rc = 0
_aid_1 = [1 , 3]
_b = []
p = []
null = []
#_AidVar[0][3] += 1

# Aufnahme, bis zum max. Pixel.
if (self._AidVar[0][2] > self._AidVar[0][3]): #(len (_Buffer[0][0]) <_AidVar[0][2] or len (_Buffer[0][0]) ==_AidVar[0][2]):
for i in range (_AidVar[0][1]):
for ii in range (2):
#print 'self._Buffer[ii]' , i, ii, len(self._Buffer[ii])
rc = 1
if (ii == 0):
self._Buffer[ii].append (self._AidVar[i + 1][_aid_1[ii]] + self._AidVar[0][4])
#print 'KANAL : ' , i , 'TIMER : ' , _Buffer[i][0]
#print 'KANAL : ' , i , 'VALUE : ' , _Buffer[i][1]
#self.ShiftList (self._Buffer[i][ii] , self._AidVar[i + 1][_aid_1[ii]] + self._AidVar[0][4])#

if (ii == 1):
self._Buffer[i][ii].append (self._AidVar[i + 1][_aid_1[ii]])
#self.ShiftList (self._Buffer[i][ii] , self._AidVar[i + 1][_aid_1[ii]])
#p.append(self._AidVar[i + 1][_aid_1[ii]])
#for iii in range (len (self._Buffer[i][ii])):
#p.append (self._Buffer[i][ii][iii])
#x = p
self._AidVar[0][3] += 1

else:
for i in range (self._AidVar[0][1]):
for ii in range (1, 2):
rc = 1
self._Buffer[i][ii] = self._Buffer[i][ii][1:len(self._Buffer[i][ii])]
self._Buffer[i][ii].append (self._AidVar[i + 1][_aid_1[ii]])
#self.TransfrmList (self._Buffer[i][ii] , self._AidVar[i + 1][_aid_1[ii]])

self.Init_Pointer(self._AidVar)


return rc
###############<End Of Function.>###################

################<Beginning of Function:>#########
###### <Autor: >
###### <Description:>
def delCan (self):
z = 1
for i in range (self._AidVar[0][1]):
z = 0
#for REST_EINTRAG in self._f[i].find_all ():
#self._f[i].delete (REST_EINTRAG)
#print 'lll'
for REST_EINTRAG in self._f[i].find_all ():
z += 1
print '_f[i] : ' , i , z #'Shows : ' , self._f[i].find_all ()

###############<End Of Function.>###################

def _drawCurve (self , _AidVar , _Buffer):
z = 0
print z

for i in range (self._AidVar[0][1]):
if (self._AidVar[0][3] < self._AidVar[0][2] or self._AidVar[0][3] == self._AidVar[0][2]):
self._f[1].delete (ALL)
#print z


################<Beginning of Function:>#########
###### <Autor: >
###### <Description:>
def __drawCurve (self , _AidVar , _Buffer):

z = []
for ii in range ( 200 ):
z.append (self._f[1].create_line (50 , 25 , 500, 25, fill = 'green'))
#self._f[0].update ()
#self._f[0].delete (ALL)
#self._f[1].delete (ALL)
#self._f[2].delete (ALL)


###############<End Of Function.>###################

################<Beginning of Function:>#########
###### <Autor: >
###### <Description:>
def __drawCurve (self , _AidVar , _Buffer):

for i in range (self._AidVar[0][1]):
if (self._AidVar[0][3] < self._AidVar[0][2] or self._AidVar[0][3] == self._AidVar[0][2]):
self._f[i].create_rectangle (0 , 0 , 1100 , 110 , width=0 , fill = 'white')
self._f[i].delete (ALL)

print '>>>>>>>>' , len(self._Buffer[i][0])
for ii in range (len(self._Buffer[i][0]) -1 ):
print len(self._Buffer[i][0])
if (len (self._Buffer[i][0]) > 0):
if (self._Buffer[i][0][ii] < self._Buffer[i][0][ii+1]): # or self._Buffer[i][0][ii] > self._Buffer[i][0][ii+1]):

x = self._f[i].create_line (self._Buffer[i][0][ii] , self._Buffer[i][1][ii] /(-10) + 80 , self._Buffer[i][0][ii+1] , self._Buffer[i][1][ii+1] /(-10) + 80, fill = 'green')
#for REST_EINTRAG in self._f[i].find_all ():
#self._f[i].delete (REST_EINTRAG)

self._f[i].update ()
###############<End Of Function.>###################

################<Beginning of Function:>#########
###### <Autor: >
###### <Description:>
def testMem (self):
for i in range (3):
for ii in range (2):
print 'Laenge von _Buffer : ' , len(self._Buffer[i][ii])

for i in range (13):
print 'Laenge von _AidVar : ' , len (self._AidVar[i])

for i in range (3):
print 'Laenge von _f' , self._f[i]


###############<End Of Function.>###################


if __name__ == "__main__":
root = Tkinter.Tk()
root.title("Start- EKGTest")

startEKG (root)
#startEKG.WinNameTrnasfer (root)
#fobj = open ('/dev/ttyUSB0', "r")
#root.createfilehandler (fobj , tkinter.READABLE , callback)

root.mainloop()

Hallo Leute,
rashury
User
Beiträge: 16
Registriert: Dienstag 19. Januar 2010, 13:09
Wohnort: Wien
Kontaktdaten:

Hat nicht funktioniert, ich finde heraus, warum nicht,
Hallo Leute,
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Solange du den Tipp mit dem Syntax-Highlighting nicht beherzigst bzw. deinen Code in ein pastebin auslagerst, wird dir niemand helfen können bzw. auch nicht wollen.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo rashury

Da ging scheinbar etwas in die Hosen.

1) Aktiviere im Forum-Editor zweimal die Schaltfläche 'Python'. Danach steht folgendes im Editor:
Bild

2) Hier ein superkleines Python-Code-Snippet, welches du im Thread als Highlighted Python-Code zeigen möchtest:

import Tkinter as tk

app_win = tk.Tk()
app_win.mainloop()

3) Kopiere deines oder dieses Python-Code-Snippet zwischen die beiden im Editor vorhandenen Python-Code-Tags wie hier das folgende Bild zeigt:
Bild

4) Benutze die Schaltfläche 'Vorschau' um das Highlighted Python-Code-Snippet im Thread anzuzeigen. Hier ein Bild von dem was angezeigt werden sollte:
Bild

So 'rashury' Good Luck!

Gruss wuf :wink:
Take it easy Mates!
rashury
User
Beiträge: 16
Registriert: Dienstag 19. Januar 2010, 13:09
Wohnort: Wien
Kontaktdaten:

Code: Alles auswählen


Hallo zusammen,

 viellen Dank,  ich habe den fehler im System gefunden gefunden, jetzt bleibt Speicher stabil,
 (Kopieren von Pythobcode hat unter Unix nicht funktioniert, ich hab es   
  nur unter XP geschafft, kann das allgemein stimmen?)
Gruß,
Rashury.
Hallo Leute,
Antworten