Você está na página 1de 9

Criando nossa primeira janela

O primeiro passo importar as classes necessrias.


Geralmente todas elas esto dentro do mdulo Tkinter:

Cdigo:
from Tkinter import *

E para faz-la funcionar, de fato, precisamos rod-la numa


thread utilizando o mtodo mainloop.

Cdigo:
from Tkinter import *
janela = Tk()
janela.mainloop()

Com isto j estamos aptos a enxergar nossa janela:

Como o mtodo mainloop trava a thread onde foi chamado,


nenhum cdigo que est abaixo da chamada do mtodo vai ser
executado at que a janela seja fechada.
Mais a frente aprenderemos a usar os event handlers para

contornar esse problema.

Decorando nossa janela


Uma janela vazia no de muita serventia, no verdade? :-)
Vamos aprender a preencher nossa janela com contedo!
Claro, no podemos inserir os elementos de qualquer forma,
para isso precisamos entender um pouco de containers.
Container assume um papel semelhante aos Layouts do
Swing: Eles servem para organizar os elementos na tela. O
mais simples deles o Frame, que o que vamos utiliz-lo.
Ento vamos criar um Frame onde iremos inserir elementos
(tambm chamados de widgets) dentro dele:

Cdigo:
from Tkinter import *
janela = Tk()
frame1 = Frame(janela)
janela.mainloop()

Perceba que o construtor da classe Frame espera como


parmetro uma instncia da classe Tk. Faz sentido! Outra coisa
a se perceber que criei a instncia antes da chamada do
mtodo mainloop (por causa daquele problema do travamento
da thread).
Toda vez que for inserir algo na janela, seja um container ou
widget, importante chamar o mtodo pack. O que este
mtodo faz anexar o elemento janela. Caso no o chame,
o elemento no ser visvel.

Cdigo:
from Tkinter import *
janela = Tk()
frame1 = Frame(janela)
frame1.pack()
janela.mainloop()

Agora vamos adicionar um boto nossa janela! Para isto,


veja as modificaes que fiz:

Cdigo:
from Tkinter import *
janela = Tk()
frame1 = Frame(janela)
frame1.pack()
botao = Button(frame1, text=Clique em mim!)
botao.pack()
janela.mainloop()

Parece simples, no? (<3 Python)


O que fizemos foi criar uma instncia da classe Button
passando como parmetros o container dele (no nosso caso, o
frame1) e um parmetro opcional chamado text, que ir
definir a mensagem do boto. Rodando nosso cdigo, temos o
seguinte comportamento:

Sounds good! Voc ainda pode customizar o boto com


os atributos que esta classe oferece. Por exemplo, veja o
seguinte cdigo:

Cdigo:
from Tkinter import *
janela = Tk()
frame1 = Frame(janela)
frame1.pack()
botao = Button(frame1, text=Clique em mim!)
botao[width] = 100
botao.pack()
janela.mainloop()

O cdigo acima ir resultar numa janela de largura bem maior


do que a anterior. O que fizemos foi alterar o atributo width
do Button, mudando-o para 100 (nmeros de caracteres).
Existem muitos outros atributos! Voc pode descobrir todos
eles digitando help(Tkinter.Button) no interpretador do
Python.

Posicionando os elementos na tela


Se voc fizer o experimento de adicionar mais um boto na
tela, ver que ele ir se posicionar exatamente abaixo do
anterior. Esse o comportamento padro. Mas e se
quisssemos posicionar um boto do lado do outro?
O container Frame suporta quatro tipos de posicionamentos:
LEFT, RIGHT, TOP e BOTTOM.
Voc pode definir o tipo de posicionamento na hora da
chamada do mtodo pack, da seguinte forma:

Cdigo:
from Tkinter import *
janela = Tk()
frame1 = Frame(janela)
frame1.pack()

botao = Button(frame1, text=Clique em mim!)


botao.pack(side=LEFT)
janela.mainloop()

Ento se quisssemos colocar um boto do lado do outro,


basta criar dois botes normalmente, mas na hora de dar
pack, faramos com que um tivesse side como LEFT e outro
como RIGHT, da seguinte forma:

Cdigo:
from Tkinter import *
janela = Tk()
frame1 = Frame(janela)
frame1.pack()
botao1 = Button(frame1, text=Clique em mim!)
botao1.pack(side=LEFT)
botao2 = Button(frame1, text=Eu sou o boto 2!)
botao2.pack(side=RIGHT)
janela.mainloop()

Rodando nosso cdigo, temos o seguinte resultado:

Este raciocnio pode ser estendido para alinhamento de


containers tambm, da mesmssima forma que acontece em
outras bibliotecas de interface grfica.

Event handlers
Temos um boto! Mas ele no faz nada :(

Por nossa sorte eventos no Tkinter so beeeem mais simples


do que no Swing (Java), j que no precisamos manipular
classes annimas e essas coisas todas.
Para criar um evento associado a um widget, utilizamos o
mtodo bind, que recebe dois parmetros: A ao e o
mtodo que ser chamado quando a ao for executada. Veja
o exemplo:

Cdigo:
from Tkinter import *
janela = Tk()
frame1 = Frame(janela)
frame1.pack()
botao = Button(frame1, text=Clique em mim!)
botao.bind(, clica_botao)
botao.pack()
janela.mainloop()

No cdigo acima, a ao , que a ao correspondente a


clicar com o mouse no widget, nesse caso, clicar no boto, e o
mtodo que ir ser chamado ao fazer isto o clica_botao
(devido ao paradigma funcional que Python adota, podemos
passar funes como parmetros :-D. Isso no fantstico?)
Vamos agora construir esta funo:

Cdigo:
from Tkinter import *
def clica_botao(event):
pass
janela = Tk()
frame1 = Frame(janela)
frame1.pack()
botao = Button(frame1, text=Clique em mim!)

botao.bind(, clica_botao)
botao.pack()
janela.mainloop()

Perceba que a funo recebe como parmetro um event, do


qual podemos extrair informaes importantes, como a ao
que executou aquele mtodo (quando ele est mapeado para
vrias aes ou vrias teclas, por exemplo).
Vamos agora importar a classe tkMessageBox para mostrar
uma caixa de mensagem na tela de maneira rpida.

Cdigo:
from Tkinter import *
import tkMessageBox
def clica_botao(event):
pass
janela = Tk()
frame1 = Frame(janela)
frame1.pack()
botao = Button(frame1, text=Clique em mim!)
botao.bind(, clica_botao)
botao.pack()
janela.mainloop()

E a vamos usar o tkMessageBox para mostrar ao usurio


quais eram as coordenadas do mouse quando ele clicou no
boto:

Cdigo:
from Tkinter import *
import tkMessageBox
def clica_botao(event):

tkMessageBox.showinfo("titulo", "Vc clicou na posicao (%d,


%d) da tela" % (event.x, event.y))
janela = Tk()
frame1 = Frame(janela)
frame1.pack()
botao = Button(frame1, text=Clique em mim!)
botao.bind(, clica_botao)
botao.pack()
janela.mainloop()

Rodando, temos o seguinte resultado:

Claro, existem muitos outros atributos mais interessantes que


saber as coordenadas do mouse. Um bom site para encontrar
mais propriedades este.

Concluso
Claro, no fizemos uma abordagem extensiva da biblioteca,
no era o objetivo aqui. O importante voc conhecer a
estrutura bsica e ir incrementando seu conhecimento.
Existem muitos outros widgets interessantes alm de Button:

Labels, imagens, canvas, enfim So muitos! Essa ferramenta


realmente poderosa. Esperamos que voc tenha sado deste
tutorial com uma viso ainda mais positiva em relao ao
Python! :-D
E agora, vamos a um pequeno questionrio para testar seu
conhecimento. Est preparado?
Perguntas
1. Qual a classe responsvel por criar uma janela?
2. O que um container? E um widget?
3. Para que serve o mtodo pack? Como posso us-lo para
posicionar elementos na tela?
4. Para que serve o mtodo bind?
Respostas:
1. a Tk.
2. Container um tipo especial de widget responsvel por
organizar os elementos na tela. Widget por sua vez tudo que
pode ser inserido numa janela.
3. Serve para anexar um widget janela. Sem eles no
seramos capazes de visualizar o elemento. Voc pode
posicionar elementos na tela passando um parmetro opcional
ao mtodo pack,chamado side, e atribuindo ele um desses
quatro valores: LEFT, RIGHT, TOP ou BOTTOM.
4. O mtodo bind serve para criar eventos relacionados a um
determinado widget, como o clicar de um boto e uma tecla.

Você também pode gostar