Gridsizer de WXPython: lidiar con celdas vacías
-
27-10-2019 - |
Pregunta
Estoy haciendo mi primera incursión en la programación de GUI, y estoy tratando de enfrentar con WXPYTHON. Estoy tratando de usar WXGlade, pero está resultando ser un poco erróneo.
Estoy haciendo un diseño con cuadrícula.
He resuelto que cada vez que agrega algo al Sizer, se pone en la siguiente celda. Esto significa que si tiene una celda vacía, debe llenarla con algo. ¿Estoy en lo cierto?
Este es el diseño que busco (captura de pantalla de WXGlade):
El problema es que generar código a partir de eso obtengo esto:
grid_sizer_1 = wx.GridSizer(3, 3, 0, 0)
grid_sizer_1.Add(self.button_last_page, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
grid_sizer_1.Add(self.button_up, 0, wx.ALIGN_BOTTOM|wx.ALIGN_CENTER_HORIZONTAL, 0)
grid_sizer_1.Add(self.button_next_page, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
grid_sizer_1.Add(self.button_left, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0)
grid_sizer_1.Add(self.button_select, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
grid_sizer_1.Add(self.button_right, 0, wx.ALIGN_CENTER_VERTICAL, 0)
grid_sizer_1.Add(self.button_down, 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
Aparentemente porque el botón "Down" se coloca en la séptima celda en lugar del octavo.
¿Cuál es la forma estándar de lidiar con esto? ¿Pondrías algún tipo de widget ficticio para llenar la celda vacía? Si es así, ¿qué widget? ¿O estoy usando el tipo incorrecto de Sizer?
¡Gracias!
Solución
Como dijiste ... agregar un widget ficticio (texto estático en blanco) funciona bien. También puede usar addMany () en lugar de múltiples add () 's.
grid_sizer_1 = wx.GridSizer(3, 3, 0, 0)
grid_sizer_1.AddMany( [
(self.button_last_page, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL),
(self.button_up, 0, wx.ALIGN_BOTTOM|wx.ALIGN_CENTER_HORIZONTAL),
(self.button_next_page, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL),
(self.button_left, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL),
(self.button_select, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL),
(self.button_right, 0, wx.ALIGN_CENTER_VERTICAL),
(wx.StaticText(self, -1, ''), 0, wx.EXPAND),
(self.button_down, 0, wx.ALIGN_CENTER_HORIZONTAL) ] )
Otros consejos
Estoy más familiarizado con el uso (0,0)
lo que significa agregar un tamaño estirable al sizer. Entonces, uno crearía un solo objeto como empty_cell = (0,0)
y luego pegar empty_cell
En todas partes se necesita ese espacio vacío en su Sizer (donde, por ejemplo, el WX.statictext se usa en la respuesta aceptada).