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