[Python-es] borde de celda wx grid

damufo damufo en gmail.com
Lun Feb 14 17:03:37 CET 2011


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>
>


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