Hola:
En 2011/02/14 10:39, Oswaldo Hernández escribiu:
El 13/02/2011 11:38, damufo escribió:
...
A partir del ejemplo de la demo de wxpython, he logrado dibujar los
bordes de una celda, aunque no comprendo todo el código ya que para mi
nivel de conocimiento me pierdo, fuí logrando cosas por ensaya y error.
Correcto, pero el wx.Grid es un objeto muy potente y complejo, te
recomiendo le dediques tiempo a estudiar su clases y funcionamiento.
Hasta ahora me había ido apañando con el listcontrol, pero para lo que
ahora trato de hacer ya no me vale por eso no me ha quedado más remedio
que usar el grid. La verdad es que sí se ve muy potente. Supongo que
cuando más lo use, y con tiempo iré mejorando mi dominio sobre el mismo.
Haré caso a tus recomendaciones.
Al grano, resulta que tengo una clase que hereda de
Grid.PyGridCellRenderer
esta es la que dibuja la celda especial (en mi caso quiero que le ponga
bordes), con el método Draw() en este caso pinta bordes, además quiero
que trate tambien celdas combinadas.
Lo que me gustaría es que antes de pintar los bordes pintase la celda
normal, y despues sobre ella pintase dichos bordes. Por ejemplo si por
defecto en alineación vertical tengo centrado quiero que así ponga el
texto.
Para ello en el mi calse especial sólo he puesto el código que dibuja
los bordes y el caso es que tal como esta lo de dentro se queda sin
rellenar.
Cuando creas tu propio renderizador el grid asume que tu te vas a
encargar de todo, para eso te pasa todo lo que necesitas en el metodo
Draw():
- grid.GetCellValue(row, col) te daria el valor de la celda
- attr es una instancia de GridCellAttr [1], usandola puedes saber la
alineación, fuente, colores a utilizar, etc.
- dc es el el DeviceContext sobre el que pintar [2]
- rect te informa del tamaño actual de la celda
- isSelected te indica si la celda esta en modo selección para que la
pintes del modo adecuado
Si, lo que comentas llegué a comprenderlo. No profundamente pero sí
hasta donde indicas.
Si no me equivoco este método Draw() está sobrecargando el Draw() por
defecto, hay forma de que cuando llame mi método Draw() "modificado",
dentro de el llame antes al método Draw() por defecto (clase de la que
hereda) y despues realice las modificaciones que he puesto en mi método
sobrecargado?
Espero que se entienda. (primero pinta como si de una celda normal se
tratase y despues por encima pon estas líneas)
Con clases "normales" harías una derivación del renderizador
predeterminado (GridCellStringRenderer) para hacer lo que tu quieres:
class CellRenderer(Grid.GridCellStringRenderer):
def Draw(self, grid, attr, dc, rect, row, col, isSelected):
# Ejecutar GridCellStringRenderer
super(CellRenderer, self).Draw(grid, attr, dc, rect, row, col,
isSelected)
# Parte personalizada
dc.SetPen( wx.Pen(wx.Colour( 255, 0, 0 ) , 1, wx.SOLID))
dc.DrawLine( rect.x + rect.width-1, rect.y, rect.x +
rect.width-1, rect.y + rect.height)
...
Justo lo de arriba también lo había intentado, me supuse que el super()
me ayudaría y tal como indicas a mi tampoco me funcionó, no se por que?.
Pero si lo pruebas verás que eso no funciona.
Haciendo alguna prueba he descubierto un truco que en principio parece
que funciona, pero si utilizas, hazlo con precaución, ya que no lo he
visto documentado en ningún sitio y desconozco si puede tener algún
efecto secundario:
class CellRenderer(Grid.PyGridCellRenderer):
def Draw(self, grid, attr, dc, rect, row, col, isSelected):
# ejecuar renderizador de strings
Grid.GridCellStringRenderer().Draw(grid, attr, dc, rect, row,
col, isSelected)
# Agregar parte personalizada
dc.SetPen( wx.Pen(wx.Colour( 255, 0, 0 ) , 1, wx.SOLID))
dc.DrawLine( rect.x + rect.width-1, rect.y, rect.x + rect.width-1,
rect.y + rect.height)
...
Justo esto de arriba era lo que estaba buscando y parece que funciona
tal como quería.
Muchiiiisimasss graaaaciassss Oswaldo!!!
Un Saludo
Un saludo Igualmente!
[1] <http://www.wxpython.org/docs/api/wx.grid.GridCellAttr-class.html>
[2] <http://www.wxpython.org/docs/api/wx.DC-class.html>
_______________________________________________
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/