Code

tiforadacaixa

Python3 TKINTER - Gerenciador de layout pack.

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.
TABELA 1. PARÂMETROS DE CONFIGURAÇÃO DO pack
parâmetroaçã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 inafter 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:
Pack com fill=”both” no último widget

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))
A tela resultante fica como:
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))
O resultado visual é o seguinte:
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))
O resultado visual passa a ser:
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))
O resultado é apresentado como:
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.

Postar um comentário

0 Comentários