wxPython - GridBagSizer
GridBagSizeres un calibrador versátil. Ofrece más mejoras que FlexiGridSizer.Child widgetse puede agregar a una celda específica dentro de la cuadrícula. Además, un widget secundario puede ocupar más de una celda horizontal y / o verticalmente. Por lo tanto, un texto estático y un control de texto de varias líneas en la misma fila pueden tener diferente ancho y alto.
Gridbag layoutdebe planificarse meticulosamente decidiendo la posición, el tramo y el espacio. La clase wx.GridBagSizer tiene solo un constructor que toma dos argumentos.
Wx.GridBagSizer(vgap,hgap)
El método más importante de la clase GridBagsizer es Add () que toma posición como argumento obligatorio. Los parámetros de extensión, alineación, marcas de borde y tamaño de borde son opcionales. Si no se utilizan explícitamente, asumen valores predeterminados.
Wx.GridbagSizer().Add(control, pos, span, flags, border)
La siguiente tabla enumera los métodos de la clase GridBagSizer:
SN | Métodos y descripción |
---|---|
1 | Add() Agrega el control dado en la posición especificada en la cuadrícula |
2 | GetItemPosition() Devuelve la posición de control en la cuadrícula. |
3 | SetItemPosition() Coloca un control en la posición especificada en la cuadrícula |
4 | GetItemSpan() Devuelve la extensión de fila / columna de un elemento |
5 | SetItemSpan() Amplía el elemento especificado sobre el número de filas / columnas |
El siguiente código muestra un formulario en el que hay etiquetas (StaticText) asociadas con cuadros de texto (TexCtrl). Los objetos TextCtrl se agregan con el parámetro span especificado. Por tanto, el ancho de los cuadros de texto abarca más de una columna. El cuadro de texto para el nombre abarca dos columnas.
tc = wx.TextCtrl(panel)
sizer.Add(tc, pos = (0, 1), span = (1, 2), flag = wx.EXPAND|wx.ALL, border = 5)
El cuadro de texto para la dirección es un control de texto de varias líneas que abarca tres columnas.
tc1 = wx.TextCtrl(panel,style = wx.TE_MULTILINE)
sizer.Add(tc1, pos = (1,1), span = (1, 3), flag = wx.EXPAND|wx.ALL, border = 5)
La fila que contiene el control de texto de varias líneas para la descripción está configurada para que se pueda ampliar, de modo que se expanda verticalmente hacia abajo, si el formulario se estira.
tc4 = wx.TextCtrl(panel,style = wx.TE_MULTILINE)
sizer.Add(tc4, pos = (3,1), span = (1,3), flag = wx.EXPAND|wx.ALL, border = 5)
sizer.AddGrowableRow(3)
A continuación se muestra el código completo:
import wx
class Example(wx.Frame):
def __init__(self, parent, title):
super(Example, self).__init__(parent, title = title)
self.InitUI()
self.Centre()
self.Show()
def InitUI(self):
panel = wx.Panel(self)
sizer = wx.GridBagSizer(0,0)
text = wx.StaticText(panel, label = "Name:")
sizer.Add(text, pos = (0, 0), flag = wx.ALL, border = 5)
tc = wx.TextCtrl(panel)
sizer.Add(tc, pos = (0, 1), span = (1, 2), flag = wx.EXPAND|wx.ALL, border = 5)
text1 = wx.StaticText(panel, label = "address")
sizer.Add(text1, pos = (1, 0), flag = wx.ALL, border = 5)
tc1 = wx.TextCtrl(panel,style = wx.TE_MULTILINE)
sizer.Add(tc1, pos = (1,1), span = (1, 3), flag = wx.EXPAND|wx.ALL, border = 5)
text2 = wx.StaticText(panel,label = "age")
sizer.Add(text2, pos = (2, 0), flag = wx.ALL, border = 5)
tc2 = wx.TextCtrl(panel)
sizer.Add(tc2, pos = (2,1), flag = wx.ALL, border = 5)
text3 = wx.StaticText(panel,label = "Mob.No")
sizer.Add(text3, pos = (2, 2), flag = wx.ALIGN_CENTER|wx.ALL, border = 5)
tc3 = wx.TextCtrl(panel)
sizer.Add(tc3, pos = (2,3),flag = wx.EXPAND|wx.ALL, border = 5)
text4 = wx.StaticText(panel, label = "Description")
sizer.Add(text4, pos = (3, 0), flag = wx.ALL, border = 5)
tc4 = wx.TextCtrl(panel,style = wx.TE_MULTILINE)
sizer.Add(tc4, pos = (3,1), span = (1,3), flag = wx.EXPAND|wx.ALL, border = 5)
sizer.AddGrowableRow(3)
buttonOk = wx.Button(panel, label = "Ok")
buttonClose = wx.Button(panel, label = "Close" )
sizer.Add(buttonOk, pos = (4, 2),flag = wx.ALL, border = 5)
sizer.Add(buttonClose, pos = (4, 3), flag = wx.ALL, border = 5)
panel.SetSizerAndFit(sizer)
app = wx.App()
Example(None, title = 'GridBag Demo')
app.MainLoop()
El código anterior produce la siguiente salida: