Além do uso padrão simplificado que vimos anteriormente, o gerenciador Packer disponibiliza algumas configurações que podem ser de grande ajuda no processo de layout. E além destas configurações temos métodos associados ao gerenciador que permitem um maior controle sobre a disposição dos elementos na janela.
parâmetro | ação |
---|---|
afterobjetoX
|
O objeto será inserido após o objetoX
|
anchoranchor
|
Anchor deve ser uma posição válida, tal como n ou s (norte ou sul). Especifica a posição do objeto a ser inserido
|
beforeobjetoX
|
O objeto será inserido antes do objetoX
|
expandbooleano
|
Especifica se o objeto irá se expandir para ocupar todo o espaço disponibilizado pelo mestre.booleano pode ser 1 ou 0 . Default 0
|
fill style
|
Se a dimensão do espaço disponível for maior do que o espaço requerido pelo objeto, podemos ajustar segundo o especificado pelo parâmetro style:
[none] (default) Dá ao objeto suas dimensões solicitadas pelo mesmo MAIS o espaço especificado em -padx ou -pady .
[x] . Estende o objeto horizontalmente para preencher toda a largura do espeço disponível, menos o espaço em -padx
[y] Estende o objeto verticalmente para preencher a altura total disponível, a menos do espaço especificado em -pady
[both] Estende tanto vertical como horizontalmente até preencher todo o espaço disponível.
|
in other]
|
Insere o objeto ao final da lista de empacotamento da janela identificada como “other”
|
ipadxdistância
|
Distância especifica o espaço horizontal interno em torno das laterais horizontais do objeto. Valor default 0.
|
ipadydistãncia
|
Distância especifica o espaço vertical interno em torno das laterais verticais do objeto. Valor defaul
|
padxdistância
|
Distância especifica o espaço horizontal em cada lado do objeto. Pode ser uma lista de dois valores especificando o espaço à esquerda e o espaço à direita separadamente. Valor default (0,0)
|
padydistância
|
Distância especifica o espaço vertical em cada lado do objeto. Pode ser uma lista de dois valores especificando o espaço a cima e em baixo separadamente. Valor default (0,0)
|
side lado
|
Especifica qual lado do mestre irá ser apresentado o objeto. Pode assumir os valores left (esquerda), right (direita), top(cima) e bottom (baixo). O valor default é top (cima).
|
Se as opções in, after ou before não forem especificadas, os objetos escravos serão inseridos ao final da lista de apresentação
Packer na prática
Utilizando como referência o mesmo exemplo simples anterior, vamos experimentar como se reflete na prática o efeito de algumas destas configurações. Compare com o resultado do código onde não utilizamos nenhuma opção:
Todos os scripts apresentados a seguir podem ser obtidos em nossa página de downloads, sob o nome pack170424.tar.gz. Os experimentos foram realizados em máquina Linux Mint 18.1, versão do Python 3.5.
1- fill=”both”, aplicado ao último objeto:
from tkinter import *
from platform import python_version
def main(args):
root = Tk()
Label(root, text="Texto superior", bg="red", fg="white").pack()
Label(root, text="Texto intermediário", bg="yellow", fg="black").pack()
Label(root, text="Texto inferior", bg="green", fg="white").pack(fill="both")
mainloop()
return 0
if __name__ == '__main__':
import sys
print (python_version()) #somente para verificar que estamos no ambiente virtual python 3.5
sys.exit(main(sys.argv))
A tela correspondente ficará como:
2- Alterando a ordem de inserção dos widgets na tela
Vamos inserir o terceiro label logo após o primeiro…
from tkinter import *
from platform import python_version
def main(args):
root = Tk()
lbl1= Label(root, text="Texto superior", bg="red", fg="white")
lbl2= Label(root, text="Texto intermediário", bg="yellow", fg="black")
lbl3= Label(root, text="Texto inferior", bg="green", fg="white")
lbl1.pack()
lbl2.pack()
lbl3.pack(fill="both",after=lbl1)
mainloop()
return 0
if __name__ == '__main__':
import sys
print (python_version()) #somente para verificar que estamos no ambiente virtual python 3.5
sys.exit(main(sys.argv))
Alterando a ordem de apresentação dos widgets
3-Inserindo um espaço em branco em torno dos widgets
Vamos inserir um espaço de 10 pixels em torno de cada widget:
from tkinter import *
from platform import python_version
def main(args):
root = Tk()
lbl1= Label(root, text="Texto superior", bg="red", fg="white")
lbl2= Label(root, text="Texto intermediário", bg="yellow", fg="black")
lbl3= Label(root, text="Texto inferior", bg="green", fg="white")
lbl1.pack( padx= "10", pady="10")
lbl2.pack( padx= "10", pady="10")
lbl3.pack(fill="both",after=lbl1, padx= "10", pady="10")
mainloop()
return 0
if __name__ == '__main__':
import sys
print (python_version()) #somente para verificar que estamos no ambiente virtual python 3.5
sys.exit(main(sys.argv))
Introduzindo um espaço entre os widgets
4-Preenchendo espaços quando o usuário modifica as dimensões da janela
Até o momento, se você aumentar o tamanho da janela, o espaço adicional fica vazio, conforme podemos ver na figura:
Espaços vazios quando se aumenta as dimensões da janela
Podemos fazer as dimensões dos widgets acompanharem o redimensionamento das janelas onde estão posicionados, utilizando a opção expand=1. Veja no exemplo abaixo quando inserimos esta opção no label 2.
from tkinter import *
from platform import python_version
def main(args):
root = Tk()
lbl1= Label(root, text="Texto superior", bg="red", fg="white")
lbl2= Label(root, text="Texto intermediário", bg="yellow", fg="black")
lbl3= Label(root, text="Texto inferior", bg="green", fg="white")
lbl1.pack( padx= "10", pady="10")
lbl2.pack( padx= "10", pady="10", fill= "both", expand="1" )
lbl3.pack(fill="both",after=lbl1, padx= "10", pady="10")
mainloop()
return 0
if __name__ == '__main__':
import sys
print (python_version()) #somente para verificar que estamos no ambiente virtual python 3.5
sys.exit(main(sys.argv))
Preenchendo os espaços com “expand=1”
Funções adicionais disponibilizadas pelo Packer
O Packer disponibiliza algumas funções adicionais que podem ser úteis durante o desenvolvimento das interfaces.
1-Listar um dicionário com os valores das opções de um dado pack (associado ao objeto)
Vamos listar as opções do objeto lbl1:
from tkinter import *
from platform import python_version
def main(args):
root = Tk()
lbl1= Label(root, text="Texto superior", bg="red", fg="white")
lbl2= Label(root, text="Texto intermediário", bg="yellow", fg="black")
lbl3= Label(root, text="Texto inferior", bg="green", fg="white")
lbl1.pack( padx= "10", pady="10")
lbl2.pack( padx= "10", pady="10")
lbl3.pack(fill="both",after=lbl1, padx= "10", pady="10")
lst = lbl1.pack_info()
print (lst)
mainloop()
return 0
if __name__ == '__main__':
import sys
print (python_version()) #somente para verificar que estamos no ambiente virtual python 3.5
sys.exit(main(sys.argv))
Obtendo informações sobre o pack do widget lbl1
2-Listar os widgets associados a um dado mestre
Esta função deve ser executada sobre o mestre, e não sobre um widget individual:
from tkinter import *
from platform import python_version
def main(args):
root = Tk()
lbl1= Label(root, text="Texto superior", bg="red", fg="white")
lbl2= Label(root, text="Texto intermediário", bg="yellow", fg="black")
lbl3= Label(root, text="Texto inferior", bg="green", fg="white")
lbl1.pack( padx= "10", pady="10")
lbl2.pack( padx= "10", pady="10")
lbl3.pack(fill="both",after=lbl1, padx= "10", pady="10")
lst = root.pack_slaves()
print (lst)
mainloop()
return 0
if __name__ == '__main__':
import sys
print (python_version()) #somente para verificar que estamos no ambiente virtual python 3.5
sys.exit(main(sys.argv))
O resultado é uma lista com todos os widgets associados ao mestre, conforme mostra a figura a seguir:
Obtendo informações sobre widgets associados
Além das funções acima temos ainda:
pack_forget(widgets ….) . Remove o widget do gerenciador de layout atual. O widget em si não é destruído, apenas retirado da janela. Pode ser visualizado novamente quando desejado, bastando inseri-lo novamente no pack.
pack_propagate(flag) . Se flag=1, a janela principal será aumentada automaticamente para apresentar todos os widgets filho, mesmo que as dimensões originais da janela e dos widgets não permitissem a visualização de todos os objetos na janela.
Apesar de todos estas opções, o gerenciador pack é bem limitado. Distribuições mais sofisticadas de widgets na tela exigem a criação de “frames” que englobam conjuntos de widgets, e a janela principal engloba este conjunto de frames. Quando começa a ficar nesta situação, o gerenciador grid passa a ser uma solução mais interessante. |
0 Comentários