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 -