Graficos web

Juan M. Puertas juatman_2000 en yahoo.es
Jue Ene 12 00:19:26 CET 2006


  Hola amigos:
 Llevo 3 días practicando con python, lenguaje por el que me estoy 
decidiendo dadas sus múltiples cualidades.
 Mi primer programa consiste en una web dinámica en la que introduces unas 
datos y se representan mediante gráficos.
  He pensado que el procedimiento más adecuado es crear una página html en 
la que escribes los datos, llama a un CGI en python que dibuja círculos y 
líneas de acuerdo a los datos introducidos, guarda el gráfico y llama a una 
página html que carga el gráfico guardado.
  ¿Es esta la manera más fácil?.
  Más abajo podeis ver un código wxPython que he encontrado en Internet, con 
alguna pequeña modificación. Mi pregunta es: ¿Hay alguna manera de guardar 
el gráfico mediante programación sin tener que seleccionar "Archivo/ Guardar 
Dibujo"?. He intentado que el programa se inicie, haga los dibujos y los 
guarde, pero el gráfico se guarda en blanco.
    He buscado en varios manuales y páginas web sobre wxPython, sin 
resultado, aunque seguro que la respuesta estaba ante mis narices. :-)
  He aquí el código, por si a alguien se le ocurre la solución:
  Gracias y un saludo :-)

#- 
<00> -----------------------------------------------------------------------
# Archivo           : CerCanvas.py -- 24/10/2002
# Descripción       :

from wxPython.wx import *

#- 
<00> -----------------------------------------------------------------------
# FORMULA DE TRANSFORMACIÓN DE COORDENADAS DE PANTALLA A LÓGICAS
# pxsize    : ANCHO Y ALTO EN PIXELES DE LA VENTANA GRÁFICA
# w, h      : POSICIÓN EN PIXELES EN VENTANA GRÁFICA
# p0        : COORDENADA LÓGICA ESQUINA INFERIOR IZQUIERDA
# p1        : COORDENADA LÓGICA ESQUINA SUPERIOR DERECHA
# x, y      : COORDENADA LÓGICA DEL PUNTO BUSCADO

def GetPxPoint(lp,pxsize,p0,p1):
    x,y   = lp
    x0,y0 = p0
    x1,y1 = p1
    w,h = pxsize
    px = (x-x0)*w/(x1-x0)
    py = h - (y-y0)*h/(y1-y0)
    return (px,py)

def GetLogPoint(pp,pxsize,p0,p1):
    w0,h0 = pp
    x0,y0 = p0
    x1,y1 = p1
    w,h = pxsize

    xl = w0*(x1-x0)/w + x0
    yl = (h-h0)*(y1-y0)/h + y0
    return (xl,yl)

#- 
<00> -----------------------------------------------------------------------
# pxsize : Tamaño en pixels de area a movilizar
# p0, p1 : Puntos del area lógica a representar

class CerPaintDC(wxMemoryDC):
    def __init__(self,pxsize=(1000,1000),p0=(0,0),p1=(10,10)):
        wxMemoryDC.__init__(self)
        self.pxsize = pxsize
        self.p0 = p0
        self.p1 = p1

    def GetPxPoint(self,lp):
        return GetPxPoint(lp,self.pxsize,self.p0,self.p1)

    def GetLogPoint(self,pp):
        return GetPxPoint(pp,self.pxsize,self.p0,self.p1)

    def DrawLogPoint(self,lp):
        pp = self.GetPxPoint(lp)
        apply(self.DrawPoint,pp)

    def DrawLogLine(self,lp1,lp2):
        pp1 = self.GetPxPoint(lp1)
        pp2 = self.GetPxPoint(lp2)
        pps = pp1 + pp2
        apply(self.DrawLine,pps)

    def DrawLogLines(self,lplist):
        pplist = map(self.GetPxPoint,lplist)
        self.DrawLines(pplist)


#- 
<00> -----------------------------------------------------------------------
# pxsize : Tamaño en pixels de area a movilizar
# p0, p1 : Puntos del area lógica a representar

class CerCanvas(wxScrolledWindow):
    def 
__init__(self,parent,id=-1,pos=(-1,-1),size=(-1,-1),style=wxSUNKEN_BORDER,
        pxsize=(1000,1000),p0=(0,0),p1=(10,10)):

        wxScrolledWindow.__init__(self,parent,id,pos,size,style)

        self.pxsize = pxsize
        self.p0 = p0
        self.p1 = p1
        x,y = self.pxsize
        self.bitmap = wxEmptyBitmap(x+1,y+1)

        self.SetBackgroundColour(wxNamedColor("WHITE"))
        EVT_PAINT(self, self.OnPaint)
        self.SetCursor(wxStockCursor(wxCURSOR_CROSS))
        self.SetScrollbars(20, 20, self.pxsize[0]/20, self.pxsize[1]/20)

    def OnPaint(self, event):
        dc = wxPaintDC(self)
        self.PrepareDC(dc)
        self.DoBitmapDrawing()
        self.DoDrawing(dc)

    def DoBitmapDrawing(self):
        pass

    def DoDrawing(self, dc):
        dc.BeginDrawing()
        memory = wxMemoryDC()
        memory.SelectObject(self.bitmap)
        x,y = self.pxsize
        dc.Blit(0,0,x+1,y+1,memory,0,0)
        memory.SelectObject(wxNullBitmap)
        dc.EndDrawing()

    def GetPxPoint(self,lp):
        return GetPxPoint(lp,self.pxsize,self.p0,self.p1)

    def GetLogPoint(self,pp):
        return GetPxPoint(pp,self.pxsize,self.p0,self.p1)

    def SaveToFile(self,file_name,file_type):
        self.bitmap.SaveFile(file_name,file_type)


################################################################################
# INICIO CÓDIGO DE PRUEBA

class MyCanvas(CerCanvas):
    def __init__(self,parent):
        CerCanvas.__init__(self,parent,-1,pxsize=(400,400),p0=(0,0),p1=(10,10))
        self.puntos = []
        for i in range(500):
            x = float(i)*10.0/500.0
            y = 0.8*x
            self.puntos.append((x,y))
        self.more_lines = []

    def DoBitmapDrawing(self):
        memory = CerPaintDC(self.pxsize,self.p0,self.p1)
        memory.SelectObject(self.bitmap)

        memory.BeginDrawing()
        memory.SetBackground(wxWHITE_BRUSH)
        memory.Clear()

        memory.SetPen(wxPen(wxNamedColour('GREEN')))
        memory.DrawLogLines(self.puntos)

        memory.SetPen(wxPen(wxNamedColour('BLUE')))
        memory.DrawCircle(150, 150, 100)
        memory.DrawLine(0,0,150,150)
        for i in range(10):
            memory.DrawLogLine((i,0),(i,10))
            memory.DrawLogLine((0,i),(10,i))

        if self.more_lines:
            memory.SetPen(wxPen(wxNamedColour('RED')))
            memory.DrawLogLines(self.more_lines)

        memory.SelectObject(wxNullBitmap)

#- 
<00> -----------------------------------------------------------------------

DEL_ID = wxNewId()
BMP_ID = wxNewId()
EXIT_ID = wxNewId()

class MainFrame(wxFrame):
    def __init__(self):
        wxFrame.__init__(self, NULL, -1, "Wx-Template",
                         wxDefaultPosition, wxSize(500,500))

        self.CreateStatusBar()

        mainmenu = wxMenuBar()

        menu = wxMenu()
        menu.Append(DEL_ID,'&Cambiar Dibujo\tAlt-D','')
        EVT_MENU(self,DEL_ID, self.OnDeleteCuad)
        menu.Append(BMP_ID,'&Guardar Dibujo\tAlt-I','')
        EVT_MENU(self,BMP_ID, self.SaveToFile)
        menu.Append(EXIT_ID,'&Salir','Finaliza la aplicación')
        EVT_MENU(self,EXIT_ID, self.OnCloseWindow)

        mainmenu.Append(menu, "&Archivo")
        self.SetMenuBar(mainmenu)

        self.canvas = MyCanvas(self)
        self.SaveToFile#

        self.Center(wxBOTH)
        EVT_CLOSE(self,self.OnCloseWindow)

    def OnDeleteCuad(self,event):
        self.canvas.more_lines = [(1,3),(3,3),(3,1),(1,1),(1,3)]
        self.canvas.Refresh()

    def SaveToFile(self,event):
        self.canvas.SaveToFile("test.png",wxBITMAP_TYPE_PNG) # <<< Guarda 
dibujo

    def OnCloseWindow(self,event):
        self.Destroy()

#- 
<00> -----------------------------------------------------------------------

class MainApp(wxApp):
    def OnInit(self):
        frame = MainFrame()
        frame.Show(true)
        self.SetTopWindow(frame)
        frame.SaveToFile(self) # <<< Añadido para que salve antes de salir
        return true

#- 
<00> -----------------------------------------------------------------------

def main():
    app = MainApp(0)
    app.MainLoop()
    return true

#- 
<99> -----------------------------------------------------------------------

if __name__ == '__main__':
    wxInitAllImageHandlers()
    main()


	
	
		
______________________________________________ 
LLama Gratis a cualquier PC del Mundo. 
Llamadas a fijos y móviles desde 1 céntimo por minuto. 
http://es.voice.yahoo.com




Más información sobre la lista de distribución Python-es