wxPython - GridBagSizer

GridBagSizeré um dimensionador versátil. Ele oferece mais melhorias do que FlexiGridSizer.Child widgetpode ser adicionado a uma célula específica dentro da grade. Além disso, um widget filho pode ocupar mais de uma célula horizontalmente e / ou verticalmente. Portanto, um texto estático e um controle de texto de várias linhas na mesma linha podem ter larguras e alturas diferentes.

Gridbag layoutdeve ser meticulosamente planejado, decidindo a posição, vão e a lacuna. A classe wx.GridBagSizer possui apenas um construtor recebendo dois argumentos.

Wx.GridBagSizer(vgap,hgap)

O método mais importante da classe GridBagsizer é Add (), que assume a posição de argumento obrigatório. Parâmetros de extensão, alinhamento, sinalizadores de borda e tamanho de borda são opcionais. Se não forem usados ​​explicitamente, eles assumem os valores padrão.

Wx.GridbagSizer().Add(control, pos, span, flags, border)

A tabela a seguir lista os métodos da classe GridBagSizer -

SN Métodos e Descrição
1

Add()

Adiciona o controle fornecido na posição especificada na grade

2

GetItemPosition()

Retorna a posição de controle na grade

3

SetItemPosition()

Coloca um controle na posição especificada na grade

4

GetItemSpan()

Retorna a extensão de linha / coluna de um item

5

SetItemSpan()

Abrange o item especificado pelo número de linhas / colunas

O código a seguir exibe um formulário no qual existem rótulos (StaticText) associados a caixas de texto (TexCtrl). Os objetos TextCtrl são adicionados com o parâmetro span especificado. Portanto, a largura das caixas de texto se estende por mais de uma coluna. A caixa de texto para o nome se estende por duas colunas.

tc = wx.TextCtrl(panel) 
sizer.Add(tc, pos = (0, 1), span = (1, 2), flag = wx.EXPAND|wx.ALL, border = 5)

A caixa de texto para endereço é um controle de texto multilinha que abrange três colunas.

tc1 = wx.TextCtrl(panel,style = wx.TE_MULTILINE) 
sizer.Add(tc1, pos = (1,1), span = (1, 3), flag = wx.EXPAND|wx.ALL, border = 5)

A linha que contém o controle de texto de várias linhas para a descrição é configurada para crescer de modo que se expanda verticalmente para baixo, se o formulário for alongado.

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 seguir está o 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()

O código acima produz a seguinte saída -