Você está na página 1de 92

Claudio Esperana

Python:
Python:
Interfaces Grficas com Tk
Interfaces Grficas com Tk
Interfaces Grficas
Interfaces Grficas
Tambm chamadas de Graphical User Interfaces (GUI)
Usadas em aplicaes modernas que requerem uma
interao constante com o usurio

Maior usabilidade e naturalidade do que interfaces textuais


Aplicao apresenta uma ou mais janelas com elementos
grficos que servem para comandar aes, especificar
parmetros, desenhar e exibir grficos, etc
Bibliotecas (toolkits) para construo de interfaces como

Qt

Gtk

wxWindows

Tk
Interfaces Grficas em Python
Interfaces Grficas em Python
Python possui camadas de portabilidade (bindings) para
vrias bibliotecas de construo de interfaces. Ex.:

PyQt (Qt)

PyGtk (Gtk)

wxPython (wxWindows)

Tkinter (Tk)
Multiplataforma (MS-Windows, Unix/Linux, OSX)
Tk
Tk
Toolkit originalmente criado para utilizao com a
linguagem script Tcl
Bastante leve, porttil e robusto
Um tanto obsoleto frente a outros toolkits mais modernos
como Qt ou Gtk
Camada Tkinter normalmente distribuda com o Python

Inicia um processo Tcl que toma conta dos elementos de


interface

Classes e funes do Tkinter se comunicam com o


interpretador Tcl para especifcar aspecto e comportamento
da interface
Usando Tkinter
Usando Tkinter
Importar o mdulo Tkinter

from Tkinter import *


Elementos de interface (widgets) correspondem a objetos
de diversas classes. Por exemplo:

Frame (rea retangular)

Button (boto)

Label (rtulo)

Text (caixa de texto)

Canvas (caixa de desenho)


Posio e tamanho dos elementos controlados por
gerentes de geometria

Pack (mais comum), Place, Grid


Usando Tkinter (2)
Usando Tkinter (2)
Para criar um widget, tem-se que informar o widget-pai
(parmetro master) onde geometricamente dever ser
encaixado e as opes de configurao para o widget. Ex.:
! Button(pai,text!"Cancelar",command!cancelar)
Tk j define por default uma janela principal

master=#one (default) indica que o widget ser filho da


janela principal

Outras janelas pode ser criadas criando objetos da classe


Toplevel
A funo mainloop tem que ser invocada para que a
aplicao entre no modo de tratamento de eventos
Exemplo
Exemplo
from Tkinter import *
class $pplication(Frame)%
def &&init&&(self, master!#one)%
Frame'&&init&&(self, master)
self'ms( ! Label(self, text!)*ello +orld))
self'ms('pack ()
self'b,e ! Button (self, text!)B,e), command!self'-uit)
self'b,e'pack ()
self'pack()
app ! $pplication()
mainloop()
Exemplo
Exemplo
from Tkinter import *
class $pplication(Frame)%
def &&init&&(self, master!#one)%
Frame'&&init&&(self, master)
self'ms( ! Label(self, text!)*ello +orld))
self'ms('pack ()
self'b,e ! Button (self, text!)B,e), command!self'-uit)
self'b,e'pack ()
self'pack()
app ! $pplication()
mainloop()
Exemplo
Exemplo
from Tkinter import *
class $pplication(Frame)%
def &&init&&(self, master!#one)%
Frame'&&init&&(self, master)
self'ms( ! Label(self, text!)*ello +orld))
self'ms('pack ()
self'b,e ! Button (self, text!)B,e), command!self'-uit)
self'b,e'pack ()
self'pack()
app ! $pplication()
mainloop()
Elemento principal
derivado de Frame
Construtor da classe base
Janela tem um
rtulo e um boto
Interface
instanciada
Lao de tratamento de
eventos iniciado
Classes de componentes
Classes de componentes
Button Um boto simples usado para executar um comando
Canvas Prov facilidades de grficos estruturados
C.eckbutton Representa uma varivel que pode ter dois
valores distintos (tipicamente um valor booleano). Clicando no
boto alterna-se entre os valores
/ntr, Um campo para entrada de uma linha de texto
Frame Usado como agrupador de widgets
Label Mostra um texto ou uma imagem
Listbox Mostra uma lista de alternativas. Pode ser
configurado para ter comportamento de checkbutton ou
radiobutton
Classes de componentes (cont)
Classes de componentes (cont)
0enu Um painel de menu. Implementa menus de janela, pulldowns e
popups
0essa(e Similar ao widget Label, mas tem mais facilidade para
mostrar texto quebrado em linhas
1adiobutton Representa um possvel valor de uma varivel que
tem um de muitos valores. Clicando o boto, a varivel assume
aquele valor
2cale Permite especificar um valor numrico atravs de um
ponteiro em uma escala linear
2crollbar Barra de rolamento para widgets que tm superfcie til
varivel (Text, Canvas, Entry, Listbox)
Text Exibe e permite editar texto formatado. Tambm suporta
imagens e janelas embutidas
Toplevel Uma janela separada
! Classe Tk
! Classe Tk
a que define uma janela principal e o interpretador Tcl
Em geral, nunca precisa ser instanciada

instanciada automaticamente quando um widget filho


criado
Pode ser instanciada explicitamente
Possui vrios mtodos, entre os quais

title (string) Especifica o ttulo da janela

(eometr,(string) Especifica tamanho e posio da janela

String tem a forma larguraxaltura3x3y


Exemplo
Exemplo
from Tkinter import *
class $pplication(Frame)%
def &&init&&(self, master!#one)%
Frame'&&init&&(self, master)
self'ms( ! Label(self, text!)*ello +orld))
self'ms('pack ()
self'b,e ! Button (self, text!)B,e), command!self'-uit)
self'b,e'pack ()
self'pack()
app ! $pplication()
app'master'title()/xemplo))
app'master'(eometr,()455x45536553655))
mainloop()
"p#$es de
"p#$es de
Widgets
Widgets
Widgets (elementos de interface) tm opes com
nomenclatura unificada. Ex.:

text Texto mostrado no elemento

back(round cor de fundo

fore(round cor do texto

font fonte do texto

relief relevo da borda (7flat7, 7raised7, 7rid(e7,


7sunken7, 7(roove7)
Opes so especificadas

No construtor

Atravs do mtodo confi(ure


Exemplo
Exemplo
from Tkinter import *
top ! Frame() 8 top'pack()
rotulo ! Label (top, text!)19tulo /xemplo),
fore(round!)blue))
rotulo'pack ()
rotulo'confi(ure(relief!)rid(e), font!)$rial 4: bold),
border!;, back(round!),ello))
" m%todo confi&'re
" m%todo confi&'re
Usado com pares do tipo opo=valor, modifica os valores dos
atributos
Usado com uma string nomeopo retorna a configurao da
opo com esse nome

A configurao uma tupla com 5 valores

nome do atributo

nome do atributo no banco de dados (X11)

nome da classe no banco de dados (X11)

objeto que representa a opo

valor corrente da opo


Se confi(ure usado sem argumentos, retorna um dicionrio
com todas as opes
Pode-se obter diretamente o valor de uma opo usando o
mtodo c(et
Exemplo
Exemplo
<<< rotulo'confi(ure(relief!)rid(e))
<<< rotulo'confi(ure()relief))
(7relief7, 7relief7, 71elief7, =index ob>ect at
5x?;f@;A5<, 7rid(e7)
<<< rotulo'confi(ure()B)relief)C
(7relief7, 7relief7, 71elief7, =index ob>ect at
5x?;f@;A5<, 7rid(e7)
<<< rotulo'confi(ure()relief))B:C
7rid(e7
<<< rotulo'c(et()relief))
7rid(e7
Gerenciando &eometrias
Gerenciando &eometrias
Todos os elementos de interface ocupam uma rea
retangular na janela
A posio e tamanho de cada elemento determinada por
um gerenciador de geometria

O elemento no aparece enquanto no for informado ao


gerenciador
A geometria resultante depende de

Propriedades dos elementos (tamanho mnimo, tamanho da


moldura, etc)

Opes do gerenciador

Algoritmo usado pelo gerenciador


O gerenciador mais usado em Tk o pack
Usando o
Usando o
pack
pack
Para informar que um elemento deve ser gerenciado pelo
pack, use o mtodo pack (opes)
O pack considera o espao do elemento pai como uma
cavidade a ser preenchida pelos elementos filhos
O algoritmo usado pelo pack consiste em empacotar os
filhos de um elemento pai segundo o lado (side)
especificado

Os lados possveis so 'top', 'left', 'right' e 'bottom'

Deve-se imaginar que sempre que um elemento filho


escolhe um lado, a cavidade disponvel fica restrita ao lado
oposto
Exemplo
Exemplo
from Tkinter import *
top ! Frame() 8 top'pack()
a ! Label (top, text!)$)) 8 a'pack (side!)left))
b ! Label (top, text!)B)) 8 b'pack (side!)bottom))
c ! Label (top, text!)C)) 8 c'pack (side!)ri(.t))
d ! Label (top, text!)D)) 8 d'pack (side!)top))
for id(et in (a,b,c,d)%
id(et'confi(ure(relief!)(roove), border!65,
font!)Times 4: bold))
top'mainloop()
(edimensionamento
(edimensionamento
Por default, o pack no redimensiona os filhos quando o
pai redimensionado
Duas opes controlam o redimensionamento dos filhos

expand (booleano)

Se verdadeiro, indica que o filho deve tomar toda a cavidade


disponvel no pai

Caso contrrio, toma apenas o espao necessrio (default)

fill (7none7, 7x7, 7,7 ou 7bot.7)

Indica como o desenho do elemento ir preencher o espao


alocado

'x' / 'y' indica que ir preencher a largura / altura

'both' indica preenchimento de todo o espao

'none' indica que apenas o espao necessrio ser ocupado


(default)
Exemplo
Exemplo
from Tkinter import *
top ! Frame() 8 top'pack()
a ! Label (top, text!)$)) 8 a'pack (side!)left),
fill!),))
b ! Label (top, text!)B)) 8 b'pack (side!)bottom),
fill!)x))
c ! Label (top, text!)C)) 8 c'pack (side!)ri(.t))
d ! Label (top, text!)D)) 8 d'pack (side!)top))
for id(et in (a,b,c,d)%
id(et'confi(ure(relief!)(roove), border!65,
font!)Times 4: bold))
top'mainloop()
Exemplo
Exemplo
from Tkinter import *
top ! Frame() 8 top'pack()
a ! Label (top, text!)$)) 8 a'pack (side!)left),
fill!),))
b ! Label (top, text!)B)) 8 b'pack (side!)bottom),
fill!)x))
c ! Label (top, text!)C)) 8 c'pack (side!)ri(.t))
d ! Label (top, text!)D)) 8 d'pack (side!)top))
for id(et in (a,b,c,d)%
id(et'confi(ure(relief!)(roove), border!65,
font!)Times 4: bold))
top'mainloop()
Exemplo
Exemplo
from Tkinter import *
top ! Frame() 8 top'pack(fill!7bot.7, expand!True)
a ! Label (top, text!)$)) 8 a'pack
(side!)left),fill!),))
b ! Label (top, text!)B)) 8 b'pack
(side!)bottom),fill!)x))
c ! Label (top, text!)C)) 8 c'pack (side!)ri(.t))
d ! Label (top, text!)D)) 8 d'pack (side!)top))
for id(et in (a,b,c,d)%
id(et'confi(ure(relief!)(roove), border!65,
font!)Times 4: bold))
top'mainloop()
Exemplo
Exemplo
from Tkinter import *
top ! Frame() 8 top'pack(fill!7bot.7, expand!True)
a ! Label (top, text!)$)) 8 a'pack
(side!)left),fill!),))
b ! Label (top, text!)B)) 8 b'pack
(side!)bottom),fill!)x))
c ! Label (top, text!)C)) 8 c'pack (side!)ri(.t))
d ! Label (top, text!)D)) 8 d'pack (side!)top))
for id(et in (a,b,c,d)%
id(et'confi(ure(relief!)(roove), border!65,
font!)Times 4: bold))
top'mainloop()
Exemplo
Exemplo
from Tkinter import *
top ! Frame() 8 top'pack(fill!7bot.7, expand!True)
a ! Label (top, text!)$)) 8 a'pack
(side!)left),expand!True,fill!),))
b ! Label (top, text!)B)) 8 b'pack
(side!)bottom),expand!True,fill!)bot.))
c ! Label (top, text!)C)) 8 c'pack (side!)ri(.t))
d ! Label (top, text!)D)) 8 d'pack (side!)top))
for id(et in (a,b,c,d)%
id(et'confi(ure(relief!)(roove), border!65,
font!)Times 4: bold))
top'mainloop()
Exemplo
Exemplo
from Tkinter import *
top ! Frame() 8 top'pack(fill!7bot.7, expand!True)
a ! Label (top, text!)$)) 8 a'pack
(side!)left),expand!True,fill!),))
b ! Label (top, text!)B)) 8 b'pack
(side!)bottom),expand!True,fill!)bot.))
c ! Label (top, text!)C)) 8 c'pack (side!)ri(.t))
d ! Label (top, text!)D)) 8 d'pack (side!)top))
for id(et in (a,b,c,d)%
id(et'confi(ure(relief!)(roove), border!65,
font!)Times 4: bold))
top'mainloop()
Usando frames
Usando frames
Frames podem ser usados para auxiliar no layout dos
elementos com pack. Ex.:
from Tkinter import *
top ! Frame() 8 top'pack(fill!7bot.7, expand!True)
f ! Frame (top)8 f'pack (fill!7x7)
a ! Label (f, text!)$))
b ! Label (f, text!)B))
c ! Label (f, text!)C))
d ! Label (top, text!)D))
for in (a,b,c,d)%
'confi(ure(relief!)(roove), border!65,
font!)Times 4: bold))
'pack(side!)left), expand!True, fill!)bot.))
top'mainloop()
Usando frames
Usando frames
Frames podem ser usados para auxiliar no layout dos
elementos com pack. Ex.:
from Tkinter import *
top ! Frame() 8 top'pack(fill!7bot.7, expand!True)
f ! Frame (top)8 f'pack (fill!7x7)
a ! Label (f, text!)$))
b ! Label (f, text!)B))
c ! Label (f, text!)C))
d ! Label (top, text!)D))
for in (a,b,c,d)%
'confi(ure(relief!)(roove), border!65,
font!)Times 4: bold))
'pack(side!)left), expand!True, fill!)bot.))
top'mainloop()
Pro&rama#)o com e*entos
Pro&rama#)o com e*entos
Diferente da programao convencional
O programa no est sob controle 100% do tempo

Programa entrega controle ao sistema

Em Tk: mtodo(funo) mainloop


Interao gera eventos. Ex:

Acionamento de um menu ou de um boto

Mouse arrastado sobre uma janela

Uma caixa de texto teve seu valor alterado


O tratamento de um evento feito por uma rotina
Callback
! op#)o
! op#)o
command
command
Muitos componentes do Tk suportam a opo command
que indica uma funo a ser invocada sempre que o
widget acionado
Tipicamente, a funo (ou mtodo) usado obtm valores
de outros widgets para realizar alguma operao
Exemplo
Exemplo
from Tkinter import *
def inc()%
n!int(rotulo'confi(ure()text))B:C)36
rotulo'confi(ure(text!str(n))

b ! Button(text!)Encrementa),command!inc)
b'pack()
rotulo ! Label(text!)5))
rotulo'pack()
mainloop()
Exemplo
Exemplo
from Tkinter import *
def inc()%
n!int(rotulo'confi(ure()text))B:C)36
rotulo'confi(ure(text!str(n))

b ! Button(text!)Encrementa),command!inc)
b'pack()
rotulo ! Label(text!)5))
rotulo'pack()
mainloop()
Exemplo
Exemplo
from Tkinter import *
def inc()%
n!int(rotulo'confi(ure()text))B:C)36
rotulo'confi(ure(text!str(n))

b ! Button(text!)Encrementa),command!inc)
b'pack()
rotulo ! Label(text!)5))
rotulo'pack()
mainloop()
E*entos e
E*entos e
Bind
Bind
Widgets que no dispem da opo command tambm
podem receber eventos e responder a eles
O mtodo bind permite especificar um padro de eventos
ao qual o widget ser sensvel e uma rotina callback para
trat-lo
bind(padro,rotina)

padro uma string que descreve quais eventos a rotina ir


tratar

rotina uma funo ou mtodo com exatamente um


parmetro: o evento que deve ser tratado
Exemplo
Exemplo
from Tkinter import *
def clica (e)%
txt ! )0ouse clicado emFnGd,Gd)G(e'x,e',)
r'confi(ure(text!txt)

r ! Label()
r'pack(expand!True, fill!)bot.))
r'master'(eometr,()455x455))
r'bind()=ButtonH6<), clica)
mainloop()
Exemplo
Exemplo
from Tkinter import *
def clica (e)%
txt ! )0ouse clicado emFnGd,Gd)G(e'x,e',)
r'confi(ure(text!txt)

r ! Label()
r'pack(expand!True, fill!)bot.))
r'master'(eometr,()455x455))
r'bind()=ButtonH6<), clica)
mainloop()
Exemplo
Exemplo
from Tkinter import *
def clica (e)%
txt ! )0ouse clicado emFnGd,Gd)G(e'x,e',)
r'confi(ure(text!txt)

r ! Label()
r'pack(expand!True, fill!)bot.))
r'master'(eometr,()455x455))
r'bind()=ButtonH6<), clica)
mainloop()
Campos do o+,eto e*ento
Campos do o+,eto e*ento
x,, : posio do mouse com relao ao canto superior
esquerdo do widget
x&root, ,&root: posio do mouse com relao ao canto
superior esquerdo da tela
c.ar: caractere digitado (eventos de teclado)
ke,s,m: representao simblica da tecla
ke,code: representao numrica da tecla
num: nmero do boto 1/2/3=Esquerdo/Meio/Direito
(eventos de mouse)
id(et: o objeto que gerou o evento
idt.,.ei(.t: largura e altura do widget (evento Configure)
Padr$es de e*ento (mo'se)
Padr$es de e*ento (mo'se)
=ButtonHi< para i = 1,2,3: boto i do mouse pressionado
sobre o widget
=0otion< : mouse arrastado sobre o widget
=BiH0otion< : mouse arrastado sobre o widget com o boto i
pressionado
=Button1eleaseHi< : boto i do mouse solto sobre o widget
=DoubleHButtonHi>: boto i do mouse clicado duas vezes
em seguida
=/nter<: O mouse entrou na rea do widget
=Leave<: O mouse saiu da rea do widget
Padr$es de e*ento (teclado)
Padr$es de e*ento (teclado)
caracter : O caracter foi digitado sobre o widget
=Ie,<: Algum caracter foi digitado sobre o widget
=1eturn<: Tecla enter foi digitada
=Tab<, =F6<, =Jp<...: A tecla correspondente foi digitada
=2.iftHTab<, =$ltHF6<, =CtrlHJp<...: Tecla com
modificador
Para os eventos serem gerados, preciso que o foco de teclado
esteja sobre o widget

Depende do sistema de janelas

O foco para um widget pode ser forado usando o mtodo


focus
Exemplo
Exemplo
from Tkinter import *
def clica (e)%
txt ! )0ouse clicado emFnGd,Gd)G(e'x,e',)
r'confi(ure(text!txt)
r'focus()
def tecla(e)%
txt!)Ie,s,m!GsFnIe,code!GsFnC.ar!Gs)F
G(e'ke,s,m,e'ke,code,e'c.ar)
r'confi(ure(text!txt)
r ! Label()
r'pack(expand!True, fill!)bot.))
r'master'(eometr,()455x455))
r'bind()=ButtonH6<), clica)
r'bind()=Ie,<), tecla)
Exemplo
Exemplo
from Tkinter import *
def clica (e)%
txt ! )0ouse clicado emFnGd,Gd)G(e'x,e',)
r'confi(ure(text!txt)
r'focus()
def tecla(e)%
txt!)Ie,s,m!GsFnIe,code!GsFnC.ar!Gs)F
G(e'ke,s,m,e'ke,code,e'c.ar)
r'confi(ure(text!txt)
r ! Label()
r'pack(expand!True, fill!)bot.))
r'master'(eometr,()455x455))
r'bind()=ButtonH6<), clica)
r'bind()=Ie,<), tecla)
Exemplo
Exemplo
from Tkinter import *
def clica (e)%
txt ! )0ouse clicado emFnGd,Gd)G(e'x,e',)
r'confi(ure(text!txt)
r'focus()
def tecla(e)%
txt!)Ie,s,m!GsFnIe,code!GsFnC.ar!Gs)F
G(e'ke,s,m,e'ke,code,e'c.ar)
r'confi(ure(text!txt)
r ! Label()
r'pack(expand!True, fill!)bot.))
r'master'(eometr,()455x455))
r'bind()=ButtonH6<), clica)
r'bind()=Ie,<), tecla)
Exemplo
Exemplo
from Tkinter import *
def clica (e)%
txt ! )0ouse clicado emFnGd,Gd)G(e'x,e',)
r'confi(ure(text!txt)
r'focus()
def tecla(e)%
txt!)Ie,s,m!GsFnIe,code!GsFnC.ar!Gs)F
G(e'ke,s,m,e'ke,code,e'c.ar)
r'confi(ure(text!txt)
r ! Label()
r'pack(expand!True, fill!)bot.))
r'master'(eometr,()455x455))
r'bind()=ButtonH6<), clica)
r'bind()=Ie,<), tecla)
Exemplo
Exemplo
from Tkinter import *
def clica (e)%
txt ! )0ouse clicado emFnGd,Gd)G(e'x,e',)
r'confi(ure(text!txt)
r'focus()
def tecla(e)%
txt!)Ie,s,m!GsFnIe,code!GsFnC.ar!Gs)F
G(e'ke,s,m,e'ke,code,e'c.ar)
r'confi(ure(text!txt)
r ! Label()
r'pack(expand!True, fill!)bot.))
r'master'(eometr,()455x455))
r'bind()=ButtonH6<), clica)
r'bind()=Ie,<), tecla)
-en's
-en's
Podem ser associados a uma janela (menus toplevel),
pulldown, popup e em cascata a partir de outro menu
Todos so instncias da classe Menu
Um menu composto de itens que podem ser

command quando pressionado executa uma callback

c.eckbox parecido com command, mas tem um valor


booleano associado

radiobutton como command, mas representa um de


vrios estados mutuamente exclusivos

cascade ativa um outro menu em cascata


Para adicionar um item a um menu, use mtodos da
forma add (tipo, opes) ou add&tipo(opes)
-en' de ,anela (tople*el)
-en' de ,anela (tople*el)
tipicamente exibido horizontalmente no topo da janela

Aspecto depende do sistema operacional


Se um outro menu associado como item cascade, ele
tratado como pulldown, isto , exibido sob o item do
menu de janela
Assim como outros menus, no necessita ter sua
geometria gerenciada (e.g., pack ou grid)
Para associar a uma janela, usa-se a opo menu do objeto
janela.
Exemplo
Exemplo
from Tkinter import *
def abrir()% print )abrir)
def salvar()% print )salvar)
def a>uda() % print )a>uda)
top!Tk()
principal!0enu(top)
ar-uivo!0enu(principal)
ar-uivo'add&command(label!)$brir),command!abrir)
ar-uivo'add&command(label!)2alvar),command!salvar)
principal'add&cascade(label!)$r-uivo),menu!ar-uivo)
principal'add&command(label!)$>uda),command!a>uda)
top'confi(ure(menu!principal)
Exemplo
Exemplo
from Tkinter import *
def abrir()% print )abrir)
def salvar()% print )salvar)
def a>uda() % print )a>uda)
top!Tk()
principal!0enu(top)
ar-uivo!0enu(principal)
ar-uivo'add&command(label!)$brir),command!abrir)
ar-uivo'add&command(label!)2alvar),command!salvar)
principal'add&cascade(label!)$r-uivo),menu!ar-uivo)
principal'add&command(label!)$>uda),command!a>uda)
top'confi(ure(menu!principal)
Exemplo
Exemplo
from Tkinter import *
def abrir()% print )abrir)
def salvar()% print )salvar)
def a>uda() % print )a>uda)
top!Tk()
principal!0enu(top)
ar-uivo!0enu(principal)
ar-uivo'add&command(label!)$brir),command!abrir)
ar-uivo'add&command(label!)2alvar),command!salvar)
principal'add&cascade(label!)$r-uivo),menu!ar-uivo)
principal'add&command(label!)$>uda),command!a>uda)
top'confi(ure(menu!principal)
-en's Pop'p
-en's Pop'p
Um menu popup aquele que exibido numa janela
independente
Para que o menu seja exibido, preciso invocar o mtodo
post:
post (x, ,)

onde x e y so as coordenadas do canto superior esquerdo


do menu com relao ao canto superior esquerdo da tela
Exemplo
Exemplo
from Tkinter import *
def alo()% print )$loK)
root ! Tk()
menu ! 0enu(root, tearoff!5)
menu'add&command(label!)$lo 6), command!alo)
menu'add&command(label!)$lo 4), command!alo)
def popup(e)% menu'post(e'x&root, e',&root)
frame ! Frame(root, idt.!455, .ei(.t!455)
frame'pack()
frame'bind()=ButtonHA<), popup)
mainloop()
Exemplo
Exemplo
from Tkinter import *
def alo()% print )$loK)
root ! Tk()
menu ! 0enu(root, tearoff!5)
menu'add&command(label!)$lo 6), command!alo)
menu'add&command(label!)$lo 4), command!alo)
def popup(e)% menu'post(e'x&root, e',&root)
frame ! Frame(root, idt.!455, .ei(.t!455)
frame'pack()
frame'bind()=ButtonHA<), popup)
mainloop()
.ari*eis
.ari*eis
Tk controlado por um interpretador Tcl (e no
diretamente pelo python)
Em alguns casos, deseja-se usar usar variveis na interface

Por exemplo, possvel especificar que o texto exibido em


um Label o valor de uma varivel (e no uma constante)

Nesse caso, usa-se a opo textvar ao inves de text


Variveis Tcl so expostas aplicaoPython atravs das
classes 2trin(Lar, EntLar e DoubleLar

O construtor da forma 2trin(Lar(master) onde master


uma janela ou widget
Instncias dessas classes possuem os mtodos (et e set
que podem ser usados para acessar os valores
armazenados no interpretador Tcl
Exemplo
Exemplo
from Tkinter import *
root ! Tk()
soma ! DoubleLar(root)
parcela ! DoubleLar(root)
def aritmetica (e)%
soma'set(soma'(et()3parcela'(et())

lsoma ! Label(textvar!soma)
eparcela ! /ntr,(textvar!parcela)
eparcela'bind()=1eturn<), aritmetica)
lsoma'pack()
eparcela'pack()
Exemplo
Exemplo
from Tkinter import *
root ! Tk()
soma ! DoubleLar(root)
parcela ! DoubleLar(root)
def aritmetica (e)%
soma'set(soma'(et()3parcela'(et())

lsoma ! Label(textvar!soma)
eparcela ! /ntr,(textvar!parcela)
eparcela'bind()=1eturn<), aritmetica)
lsoma'pack()
eparcela'pack()
Exemplo
Exemplo
from Tkinter import *
root ! Tk()
soma ! DoubleLar(root)
parcela ! DoubleLar(root)
def aritmetica (e)%
soma'set(soma'(et()3parcela'(et())

lsoma ! Label(textvar!soma)
eparcela ! /ntr,(textvar!parcela)
eparcela'bind()=1eturn<), aritmetica)
lsoma'pack()
eparcela'pack()
Exemplo
Exemplo
from Tkinter import *
root ! Tk()
soma ! DoubleLar(root)
parcela ! DoubleLar(root)
def aritmetica (e)%
soma'set(soma'(et()3parcela'(et())

lsoma ! Label(textvar!soma)
eparcela ! /ntr,(textvar!parcela)
eparcela'bind()=1eturn<), aritmetica)
lsoma'pack()
eparcela'pack()
Check+'ttons
Check+'ttons
C.eckbutton Representa uma varivel que pode ter dois
valores distintos (tipicamente um valor booleano). Clicando no
boto alterna-se entre os valores
A callback especificada pela opo command chamada
sempre que a varivel muda de valor
Estado armazenado pela varivel Tcl especificada pela opo
variable
Se a varivel inteira, o valor correspondente ao checkbutton
desligado/ligado 0/1
possvel usar um checkbutton com uma varivel string

Nesse caso, os valores correspondentes a


desligado/ligado so especificados com as opes
offvalue e onvalue
Exemplo
Exemplo
from Tkinter import *
root ! Tk()
v6 ! EntLar(root)
v4 ! 2trin(Lar(root)
def exibe()%
l'confi( (text!)v6!Gd,v4!Gs)G(v6'(et(),v4'(et()))
c6 ! C.eckbutton (text!)L6), var!v6, command!exibe)
c4 ! C.eckbutton (text!)L4), var!v4, command!exibe,F
onvalue!)2im), offvalue!)#ao))
l ! Label()
for in (c6,c4,l)%'pack()
exibe()
Exemplo
Exemplo
from Tkinter import *
root ! Tk()
v6 ! EntLar(root)
v4 ! 2trin(Lar(root)
def exibe()%
l'confi( (text!)v6!Gd,v4!Gs)G(v6'(et(),v4'(et()))
c6 ! C.eckbutton (text!)L6), var!v6, command!exibe)
c4 ! C.eckbutton (text!)L4), var!v4, command!exibe,F
onvalue!)2im), offvalue!)#ao))
l ! Label()
for in (c6,c4,l)%'pack()
exibe()
Exemplo
Exemplo
from Tkinter import *
root ! Tk()
v6 ! EntLar(root)
v4 ! 2trin(Lar(root)
def exibe()%
l'confi( (text!)v6!Gd,v4!Gs)G(v6'(et(),v4'(et()))
c6 ! C.eckbutton (text!)L6), var!v6, command!exibe)
c4 ! C.eckbutton (text!)L4), var!v4, command!exibe,F
onvalue!)2im), offvalue!)#ao))
l ! Label()
for in (c6,c4,l)%'pack()
exibe()
Exemplo
Exemplo
from Tkinter import *
root ! Tk()
v6 ! EntLar(root)
v4 ! 2trin(Lar(root)
def exibe()%
l'confi( (text!)v6!Gd,v4!Gs)G(v6'(et(),v4'(et()))
c6 ! C.eckbutton (text!)L6), var!v6, command!exibe)
c4 ! C.eckbutton (text!)L4), var!v4, command!exibe,F
onvalue!)2im), offvalue!)#ao))
l ! Label()
for in (c6,c4,l)%'pack()
exibe()
(adio+'ttons
(adio+'ttons
1adiobutton representa um possvel valor de uma varivel
que tem um de muitos valores. Clicando o boto, a varivel
assume aquele valor
A varivel especificada com a opo variable e o valor
associado com a opo value
Os radiobuttons que se referem mesma varivel funcionam
em conjunto

Ex.: ligar um faz com que outro seja desligado


Um radiobutton mostrado com um indicador ao lado

Pode-se desabilitar o indicador usando a opcao


indicatoron=False

Nesse caso, mostrado como um boto normal


Exemplo
Exemplo
from Tkinter import *
root!Tk()
cor ! 2trin(Lar(root)
cor'set()black))
l ! Label(back(round!cor'(et())
l'pack(fill!7bot.7,expand!True)
def pinta()% l'confi(ure(back(round!cor'(et())
for txt,val in (()preto),)black)),F
()vermel.o),)red)),F
()aMul),)blue)), ()verde),)(reen)))%
1adiobutton(text!txt,value!val,variable!cor,F
command!pinta)'pack(anc.or!+)
mainloop()
Exemplo
Exemplo
from Tkinter import *
root!Tk()
cor ! 2trin(Lar(root)
cor'set()black))
l ! Label(back(round!cor'(et())
l'pack(fill!7bot.7,expand!True)
def pinta()% l'confi(ure(back(round!cor'(et())
for txt,val in (()preto),)black)),F
()vermel.o),)red)),F
()aMul),)blue)), ()verde),)(reen)))%
1adiobutton(text!txt,value!val,variable!cor,F
command!pinta)'pack(anc.or!+)
mainloop()
Exemplo
Exemplo
from Tkinter import *
root!Tk()
cor ! 2trin(Lar(root)
cor'set()black))
l ! Label(back(round!cor'(et())
l'pack(fill!7bot.7,expand!True)
def pinta()% l'confi(ure(back(round!cor'(et())
for txt,val in (()preto),)black)),F
()vermel.o),)red)),F
()aMul),)blue)), ()verde),)(reen)))%
1adiobutton(text!txt,value!val,variable!cor,F
command!pinta)'pack(anc.or!+)
mainloop()
Exemplo
Exemplo
from Tkinter import *
root!Tk()
cor ! 2trin(Lar(root)
cor'set()black))
l ! Label(back(round!cor'(et())
l'pack(fill!7bot.7,expand!True)
def pinta()% l'confi(ure(back(round!cor'(et())
for txt,val in (()preto),)black)),F
()vermel.o),)red)),F
()aMul),)blue)), ()verde),)(reen)))%
1adiobutton(text!txt,value!val,variable!cor,F
command!pinta)'pack(anc.or!+)
mainloop()
Exemplo
Exemplo
from Tkinter import *
root!Tk()
cor ! 2trin(Lar(root)
cor'set()black))
l ! Label(back(round!cor'(et())
l'pack(fill!7bot.7,expand!True)
def pinta()% l'confi(ure(back(round!cor'(et())
for txt,val in (()preto),)black)),F
()vermel.o),)red)),F
()aMul),)blue)), ()verde),)(reen)))%
1adiobutton(text!txt,value!val,variable!cor,F
command!pinta,indicatoron!False)'pack(fill!7x7)
mainloop()
Exemplo
Exemplo
from Tkinter import *
root!Tk()
cor ! 2trin(Lar(root)
cor'set()black))
l ! Label(back(round!cor'(et())
l'pack(fill!7bot.7,expand!True)
def pinta()% l'confi(ure(back(round!cor'(et())
for txt,val in (()preto),)black)),F
()vermel.o),)red)),F
()aMul),)blue)), ()verde),)(reen)))%
1adiobutton(text!txt,value!val,variable!cor,F
command!pinta,indicatoron!False)'pack(fill!7x7)
mainloop()
Entry
Entry
Um /ntr, permite entrada/edio de uma linha de texto
O texto associado ao Entry normalmente armazenado
numa varivel indicada pela opo textvariable

Se no indicada, usada uma varivel interna cujo valor


pode ser obtido usando o mtodo get()
H diversos mtodos para manipular diretamente o texto

Usam o conceito de ndices (no confundir com os ndices


usado pelo Python)

Por exemplo, o ndice INSERT indica a posio do texto


onde o cursor de insero se encontra, 0 a posio antes do
primeiro caractere e END a posio ao final do texto
Exemplo
Exemplo
from Tkinter import *
def insere()% e'insert(E#2/1T,)*))
def limpa()% e'delete(E#2/1T,/#D)
e!/ntr,(font!)$rial 4:))
i!Button(text!)Ensere*),command!insere)
l!Button(text!)Limpa),command!limpa)
e'pack()
for in (i,l)% 'pack(side!7left7)
mainloop()
Exemplo
Exemplo
from Tkinter import *
def insere()% e'insert(E#2/1T,)*))
def limpa()% e'delete(E#2/1T,/#D)
e!/ntr,(font!)$rial 4:))
i!Button(text!)Ensere*),command!insere)
l!Button(text!)Limpa),command!limpa)
e'pack()
for in (i,l)% 'pack(side!7left7)
mainloop()
Exemplo
Exemplo
from Tkinter import *
def insere()% e'insert(E#2/1T,)*))
def limpa()% e'delete(E#2/1T,/#D)
e!/ntr,(font!)$rial 4:))
i!Button(text!)Ensere*),command!insere)
l!Button(text!)Limpa),command!limpa)
e'pack()
for in (i,l)% 'pack(side!7left7)
mainloop()
Exemplo
Exemplo
from Tkinter import *
def insere()% e'insert(E#2/1T,)*))
def limpa()% e'delete(E#2/1T,/#D)
e!/ntr,(font!)$rial 4:))
i!Button(text!)Ensere*),command!insere)
l!Button(text!)Limpa),command!limpa)
e'pack()
for in (i,l)% 'pack(side!7left7)
mainloop()
Can*as
Can*as
Permite a exibio e edio de grficos estruturados 2D
Elementos grficos (itens) so introduzidos usando
mtodos da forma create_tipo (...), onde tipo pode ser

arc arco de crculo

bitmap imagem binria

ima(e imagem colorida

line linha poligonal

oval crculos e elipses

pol,(on polgonos

rectan(le retngulo

text texto

indo um widget tk
Exemplo
Exemplo
from Tkinter import *
c ! Canvas()
c'pack()
o ! c'create&oval(6,6,455,655,outline!)blue),F
idt.!;,fill!)red))
id(et ! Button(text!)Tk Canvas))
! c'create&indo(65,645,indo!id(et,anc.or!+)
l ! c'create&line(655,5,645,A5,;5,N5,655,645,F
fill!)black),idt.!4)
r ! c'create&rectan(le(:5,6;5,655,455,fill!).ite))
im( ! P.otoEma(e(file!)p,t.on'(if))
i ! c'create&ima(e (6;5,6;5,ima(e!im(,anc.or!#+)
a ! c'create&arc (6;5,@5,4;5,6@5,start!A5,extent!N5,F
outline!)(reen),fill!)oran(e))
t ! c'create&text(455,A;,text!)TextoFnTexto),
font!)$rial 44))
Exemplo
Exemplo
from Tkinter import *
c ! Canvas()
c'pack()
o ! c'create&oval(6,6,455,655,outline!)blue),F
idt.!;,fill!)red))
id(et ! Button(text!)Tk Canvas))
! c'create&indo(65,645,indo!id(et,anc.or!+)
l ! c'create&line(655,5,645,A5,;5,N5,655,645,F
fill!)black),idt.!4)
r ! c'create&rectan(le(:5,6;5,655,455,fill!).ite))
im( ! P.otoEma(e(file!)p,t.on'(if))
i ! c'create&ima(e (6;5,6;5,ima(e!im(,anc.or!#+)
a ! c'create&arc (6;5,@5,4;5,6@5,start!A5,extent!N5,F
outline!)(reen),fill!)oran(e))
t ! c'create&text(455,A;,text!)TextoFnTexto),
font!)$rial 44))
Coordenadas de Itens
Coordenadas de Itens
Todos os mtodos create_item tm como primeiros
argumentos um par de coordenadas x,y do item

Os itens oval e rectan(le requerem mais um par de


coordenadas para delimitar a extenso (caixa envolvente)

Os itens line e pol,(on podem ser seguidos por outros


pares de coordenadas que especificam demais vrtices
As coordenadas referem-se a um sistema de coordenadas
prprio que pode ser diferente do da janela

A rea do canvas que deve ser mostrada na janela pode ser


modificada pela opo
scrollarea=(xmin,ymin,xmax,ymax)

Para obter as coordenadas do canvas dadas as coordenadas


da janela usa-se os mtodos canvasx(x) e canvas,(y)
Identifica#)o de Itens
Identifica#)o de Itens
Todo item de um canvas tem um identificador numrico
que retornado pelo mtodo create_item
Pode-se tambm associar tags (etiquetas) a itens

Usa-se a opo ta(s=tags onde tags pode ser uma string ou


uma tupla com vrias strings

Uma mesma etiqueta pode ser associada a mais de um item


O identificador ALL refere-se a todos os itens do canvas
O identificador CURRENT refere-se ao item do canvas sob
o cursor do mouse

Usado em callbacks de canvas para alterar propriedades dos


itens clicados
-%todos de Can*as
-%todos de Can*as
itemconfi( (itemOuTag, ...) altera opes do(s) item(s)
ta(&bind(itemOuTag, padro, callback) associa uma callback a
um padro de eventos sobre o(s) item(s)
delete(itemOuTag) remove o(s) item(s)
move(itemOuTag, dx,dy) translada o(s) item(s)
coords(itemOuTag, x1,x2,..xN,yN) altera as coordenadas do(s)
item(s)
coords(item) retorna as coordenadas do item
bbox(itemOuTag) retorna uma tupla com a caixa envolvente
dos itens
itemc(et(item,opo) retorna o valor da opo dada do item
Exemplo
Exemplo
from Tkinter import *
c ! Canvas()
c'pack()
def novalin.a(e)%
x,, ! c'canvasx(e'x), c'canvas,(e',)
c'create&line(x,,,x,,,ta(s!)corrente))
def estendelin.a(e)%
x,, ! c'canvasx(e'x), c'canvas,(e',)
coords ! c'coords()corrente)) 3 Bx,,C
c'coords()corrente),*coords)
def fec.alin.a(e)% c'itemconfi(()corrente),ta(s!())
c'bind()=ButtonH6<), novalin.a)
c'bind()=B6H0otion<), estendelin.a)
c'bind()=Button1eleaseH6<), fec.alin.a)
c'pack()
Exemplo
Exemplo
from Tkinter import *
c ! Canvas()
c'pack()
def novalin.a(e)%
x,, ! c'canvasx(e'x), c'canvas,(e',)
c'create&line(x,,,x,,,ta(s!)corrente))
def estendelin.a(e)%
x,, ! c'canvasx(e'x), c'canvas,(e',)
coords ! c'coords()corrente)) 3 Bx,,C
c'coords()corrente),*coords)
def fec.alin.a(e)% c'itemconfi(()corrente),ta(s!())
c'bind()=ButtonH6<), novalin.a)
c'bind()=B6H0otion<), estendelin.a)
c'bind()=Button1eleaseH6<), fec.alin.a)
c'pack()
Exemplo
Exemplo
from Tkinter import *
c ! Canvas()
c'pack()
def novalin.a(e)%
x,, ! c'canvasx(e'x), c'canvas,(e',)
c'create&line(x,,,x,,,ta(s!)corrente))
def estendelin.a(e)%
x,, ! c'canvasx(e'x), c'canvas,(e',)
coords ! c'coords()corrente)) 3 Bx,,C
c'coords()corrente),*coords)
def fec.alin.a(e)% c'itemconfi(()corrente),ta(s!())
c'bind()=ButtonH6<), novalin.a)
c'bind()=B6H0otion<), estendelin.a)
c'bind()=Button1eleaseH6<), fec.alin.a)
c'pack()
Exemplo
Exemplo
from Tkinter import *
c ! Canvas()
c'pack()
def novalin.a(e)%
x,, ! c'canvasx(e'x), c'canvas,(e',)
c'create&line(x,,,x,,,ta(s!)corrente))
def estendelin.a(e)%
x,, ! c'canvasx(e'x), c'canvas,(e',)
coords ! c'coords()corrente)) 3 Bx,,C
c'coords()corrente),*coords)
def fec.alin.a(e)% c'itemconfi(()corrente),ta(s!())
c'bind()=ButtonH6<), novalin.a)
c'bind()=B6H0otion<), estendelin.a)
c'bind()=Button1eleaseH6<), fec.alin.a)
c'pack()
Exemplo
Exemplo
'''
def selecionalin.a(e)%
(lobal x5,,5
x5,,5 ! c'canvasx(e'x), c'canvas,(e',)
c'itemconfi((CJ11/#T, ta(s!)sel))
def movelin.a (e)%
(lobal x5,,5
x6,,6 ! c'canvasx(e'x), c'canvas,(e',)
c'move()sel),x6Hx5,,6H,5)
x5,,5!x6,,6
def deselecionalin.a(e)% c'itemconfi(()sel), ta(s!())
c'bind()=ButtonHA<), selecionalin.a)
c'bind()=BAH0otion<), movelin.a)
c'bind()=Button1eleaseHA<), deselecionalin.a)
Exemplo
Exemplo
'''
def selecionalin.a(e)%
(lobal x5,,5
x5,,5 ! c'canvasx(e'x), c'canvas,(e',)
c'itemconfi((CJ11/#T, ta(s!)sel))
def movelin.a (e)%
(lobal x5,,5
x6,,6 ! c'canvasx(e'x), c'canvas,(e',)
c'move()sel),x6Hx5,,6H,5)
x5,,5!x6,,6
def deselecionalin.a(e)% c'itemconfi(()sel), ta(s!())
c'bind()=ButtonHA<), selecionalin.a)
c'bind()=BAH0otion<), movelin.a)
c'bind()=Button1eleaseHA<), deselecionalin.a)
Exemplo
Exemplo
'''
def selecionalin.a(e)%
(lobal x5,,5
x5,,5 ! c'canvasx(e'x), c'canvas,(e',)
c'itemconfi((CJ11/#T, ta(s!)sel))
def movelin.a (e)%
(lobal x5,,5
x6,,6 ! c'canvasx(e'x), c'canvas,(e',)
c'move()sel),x6Hx5,,6H,5)
x5,,5!x6,,6
def deselecionalin.a(e)% c'itemconfi(()sel), ta(s!())
c'bind()=ButtonHA<), selecionalin.a)
c'bind()=BAH0otion<), movelin.a)
c'bind()=Button1eleaseHA<), deselecionalin.a)
/croll+ar
/croll+ar
Barras de rolamento so usadas com outros widgets com
rea til maior do que pode ser exibida na janela
(Canvas, Text, Listbox, /ntr,)
Uma barra de rolamento horizontal (vertical) funciona
chamando o mtodo xvie (,vie) do widget associado

Isto feito configurando a opo command da barra


Por outro lado, sempre que a viso do widget muda, a
barra de rolamento precisa ser atualizada

Isto feito configurando a opo xscrollcommand (ou


,scrollcommand) do widget ao mtodo set da barra
Exemplo
Exemplo
from Tkinter import *
lb ! Listbox()
lb'pack(side!L/FT,expand!True,fill!)bot.))
sb ! 2crollbar()
sb'pack(side!1EG*T,fill!),))
sb'confi(ure(command!lb',vie)
lb'confi(ure(,scrollcommand!sb'set)
for i in ran(e(655)%
lb'insert(/#D,i)
Exemplo
Exemplo
from Tkinter import *
lb ! Listbox()
lb'pack(side!L/FT,expand!True,fill!)bot.))
sb ! 2crollbar()
sb'pack(side!1EG*T,fill!),))
sb'confi(ure(command!lb',vie)
lb'confi(ure(,scrollcommand!sb'set)
for i in ran(e(655)%
lb'insert(/#D,i)

Você também pode gostar