Você está na página 1de 101

Aula 5 Interface Grfica

Parte 2
Tiago Cruz de Frana
tcruz.franca@gmail.com

Python Tiago Cruz de Frana


Exemplo de Interface Grfica

Python Tiago Cruz de Frana 2


Interfaces Grficas com Usurio

Do ingls, Graphic User Interface (GUI)

Populares no ambiente Desktop


Motivos da popularidade: facilidade de uso e a produtividade

Bibliotecas disponveis:
GTK+, QT, TK etc
http://www.pygtk.org/
http://www.python.org.br/wiki/ComoUsarPyQt
https://wiki.python.org/moin/TkInter

Python Tiago Cruz de Frana 3


Interfaces Grficas

Geralmente utilizam a metfora do desktop


Um espao em duas dimenses, que ocupado por
janelas retangulares, que representam aplicativos,
propriedades ou documentos

Janelas podem possuir controles e containers

Python Tiago Cruz de Frana 4


Interfaces Grficas

Controles de janelas
Objetos utilizados para interagir com o usurio ou para
apresentar informaes
Controles podem ter teclas de atalho (aceleradores)

Containers
Objetos que servem de repositrio para colees de outros
objetos

Python Tiago Cruz de Frana 5


Interfaces Grficas

Interface grfica espera por eventos e responde de


acordo
Eventos podem ser resultado da interao do usurio
Ex: cliques, arrastar de mouse, digitao ou ainda de eventos de
sistema como o relgio da mquina

A reao a um evento qualquer definida atravs de


funes callback
Essas funes so passadas como argumento para outras rotinas

Python Tiago Cruz de Frana 6


Controles

Lista de Controles
Rtulo (label)
Retngulo que exibe texto
Caixa de texto (text box)
rea de edio de texto
Boto (button)
rea que pode ser ativada interativamente
Boto de rdio (radio button)
Tipo especial de boto, com o qual so formados grupos aonde
apenas um pode ser apertado de cada vez

Python Tiago Cruz de Frana 7


Controles

Python Tiago Cruz de Frana 8


Controles

Python Tiago Cruz de Frana 9


Controles

Python Tiago Cruz de Frana 10


Controles

Python Tiago Cruz de Frana 11


Controles

Lista de Controles (continuao)


Boto de verificao (check button)
Boto que pode ser marcado e desmarcado
Barras de rolagem (scroll bars)
Controles deslizantes horizontais ou verticais, usados para
intervalos de valores numricos
Boto giratrio (spin button)
Caixa de texto com dois botes com setas ao lado que
incrementam e decrementam o nmero na caixa

Python Tiago Cruz de Frana 12


Controles

Python Tiago Cruz de Frana 13


Controles

Python Tiago Cruz de Frana 14


Controles

Python Tiago Cruz de Frana 15


Controles

Lista de Controles (continuao)


Barra de status (status bar)
Barra para exibio de mensagens, geralmente na parte inferior
da janela
Imagem (image)
rea para exibio de imagens

Python Tiago Cruz de Frana 16


Controles

Python Tiago Cruz de Frana 17


Controles

Python Tiago Cruz de Frana 18


Containers

Lista de Containers
Barra de menu (menu bar)
Sistema de menus, geralmente na parte superior da janela
Quadro (frame)
Objetos permanecem dentro de um retngulo
Tabela (table)
Coleo de compartimentos para fixar os objetos, distribudos
em linhas e colunas

Python Tiago Cruz de Frana 19


Containers

Python Tiago Cruz de Frana 20


Containers

Python Tiago Cruz de Frana 21


Containers

Python Tiago Cruz de Frana 22


Containers

Lista de Containers (continuao)


Caixa horizontal (horizontal box)
Semelhante tabela, porm apenas com uma linha
Caixa vertical (vertical box)
Semelhante tabela, porm apenas com uma coluna
Caderno (notebook)
Vrias reas que podem ser visualizadas uma de cada vez quando
selecionadas atravs de abas, geralmente na parte superior

Python Tiago Cruz de Frana 23


Containers

Python Tiago Cruz de Frana 24


Containers

Lista de Containers (continuao)


Barra de ferramentas (tool bar)
rea com botes para acesso rpido aos principais recursos do
aplicativo

Python Tiago Cruz de Frana 25


Containers

Python Tiago Cruz de Frana 26


Interfaces e Eventos de Tempo

Para tratar de eventos de tempo, as interfaces


grficas utilizam um recurso chamado temporizador
(timer)
O timer evoca a funo callback depois de um certo tempo
programado

Python Tiago Cruz de Frana 27


Bibliotecas Grficas

Camadas de portabilidade (bindings)


Tkinter (Tk)
PyGtk (Gtk)
PyQt (Qt)

Multiplataforma (MS-Windows, Unix/Linux, OSX)

Python Tiago Cruz de Frana 28


TK
(baseado no material do prof. Paulo Roma)

Tk (Tool Kit) leve, porttil e robusto


Um tanto obsoleto frente a outros toolkits mais modernos
como Qt ou Gtk

Toolkit originalmente criado para utilizao com a


linguagem script Tool Command Lang. (Tcl)

Python Tiago Cruz de Frana 29


Tk

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 especificar aspecto e comportamento
da interface

Python Tiago Cruz de Frana 30


Uso do Tk

Para importar o mdulo Tkinter


from Tkinter import *
Elementos de interface (widgets)
Frame (rea retangular)
Button (boto)
Label (rtulo)
Text (caixa de texto)
Canvas (caixa de desenho)

Python Tiago Cruz de Frana 31


Uso do Tk

Os elementos da interface so objetos de classes


diferentes

A posio e tamanho dos elementos so


controlados por gerentes de geometria
Pack (mais comum), Place, Grid

Python Tiago Cruz de Frana 32


Uso de Tk

Criando um widget
Informe um Pai (widget pai) usando o parmetro master
Informe onde seu widget ir se encaixar
btn = Button(pai,text=Cancelar,command=cancelar)

Uma janela default ser usada


master=None (default) indica que o widget ser filho da
janela principal
Outras janelas podem ser criadas criando objetos da classe
Toplevel

Python Tiago Cruz de Frana 33


Uso de Tk

top = Toplevel()
top.title("About this application...")

msg = Message(top, text=about_message)


msg.pack()

button = Button(top, text="Dismiss",


command=top.destroy)
button.pack()

Python Tiago Cruz de Frana 34


Exemplo

Application herda
de Frame

Construtor da
superclasse

Rtulo no Boto

Lao onde so tratados os eventos

Python Tiago Cruz de Frana 35


Sada do Exemplo

Python Tiago Cruz de Frana 36


Lista de Componentes Tk

Python Tiago Cruz de Frana 37


Componentes
Label
Mostra um texto ou uma imagem

from Tkinter import *

class Application(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
lb1 = Label(text="MeuTexto")
lb1.pack()
self.pack()

app = Application()
mainloop()

Python Tiago Cruz de Frana 38


Componentes
Message
Similar ao widget Label, mas tem mais facilidade para
mostrar texto quebrado em linhas

class Application(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
var = StringVar()
label = Message(textvariable=var, relief=RAISED)
var.set("Hey!? How are you doing?")
label.pack()

Python Tiago Cruz de Frana 39


Componentes
Button
Um boto simples usado para executar um comando

from Tkinter import *


class Application(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.btn = Button(self,text="Sair",command=self.quit)
self.btn.pack()
self.pack()

app = Application()
mainloop()

Python Tiago Cruz de Frana 40


Componentes
Entry
Um campo para entrada de uma linha de texto

from Tkinter import *

class Application(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
entr = Entry()
entr.pack()
self.pack()

app = Application()
mainloop()

Python Tiago Cruz de Frana 41


Componentes
Checkbutton
Representa uma varivel que pode ter dois valores distintos
(tipicamente um valor booleano)

from Tkinter import *

class Application(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
checkb = Checkbutton(text="Me marque")
checkb.pack()
self.pack()

app = Application()
mainloop()

Python Tiago Cruz de Frana 42


Componentes
Radiobutton
Representa um possvel valor de uma varivel que tem um de
muitos valores

R1 = Radiobutton(text="Option 1", value=1)


R1.pack()
R2 = Radiobutton(text="Option 2", value=2)
R2.pack()
R3 = Radiobutton(text="Option 3", value=3)
R3.pack()
self.pack()

Python Tiago Cruz de Frana 43


Componentes
Listbox
Mostra uma lista de alternativas. Pode ser configurado para ter
comportamento de checkbutton ou radiobutton

Lb1 = Listbox()
Lb1.insert(1, "Python")
Lb1.insert(2, "Perl")
Lb1.insert(3, "C")
Lb1.insert(4, "PHP")
Lb1.insert(5, "JSP")
Lb1.insert(6, "Ruby")
Lb1.pack()
self.pack()

Python Tiago Cruz de Frana 44


Componentes
Frame
Usado para agrupar widgets

Python Tiago Cruz de Frana 45


Componentes
Frame
Usado para agrupar widgets. Aps o Frame.__init__(self, master),

frame = Frame()
frame.pack()
bottomframe = Frame()
bottomframe.pack(side = BOTTOM)
redbutton = Button(frame, text="Red", fg="red")
redbutton.pack(side = LEFT)
greenbutton = Button(frame, text="Brown", fg="brown")
greenbutton.pack(side = LEFT)
bluebutton = Button(frame, text="Blue", fg="blue")
bluebutton.pack(side = LEFT)
blackbutton = Button(bottomframe, text="Black", fg="black")
blackbutton.pack(side = BOTTOM)

Python Tiago Cruz de Frana 46


Componentes
Canvas
Funciona como a tela de um pintor onde possvel desenhar
outras formas

from Tkinter import *


class Application(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
canvas = Canvas(background='white')
canvas.pack()
texto = canvas.create_text(100, 75, text="Alo mundo!")
self.pack()
app = Application()
mainloop()

Python Tiago Cruz de Frana 47


Componentes
Canvas
# envia uma mensagem para o canvas orientando-o
# a trocar algumas caractersticas do objeto texto
canvas.itemconfig(texto, font=('SansSerif', '36'), fill='red',
anchor=NW)

Python Tiago Cruz de Frana 48


Componentes
Menu
Um painel de menu. Implementa menus de janela, pulldowns e popups

def __init__(self, master=Tk()):


Frame.__init__(self, master)
menubar = Menu()
filemenu = Menu(menubar, tearoff=0)
filemenu.add_command(label="New")
filemenu.add_command(label="Open")
filemenu.add_command(label="Save")
filemenu.add_command(label="Save as...")
filemenu.add_command(label="Close")
filemenu.add_separator()
filemenu.add_command(label="Exit", command=quit)
menubar.add_cascade(label="File", menu=filemenu)
master.config(menu=menubar)

Python Tiago Cruz de Frana 49


Componentes
Scale
Permite especificar um valor atravs de um ponteiro em uma escala linear

from Tkinter import *


def sel():
selection = "Value = " + str(var.get())
label.config(text = selection)
root = Tk()
var = DoubleVar()
scale = Scale( root, variable = var )
scale.pack(anchor=CENTER)
button = Button(root, text="Get Scale Value", command=sel)
button.pack(anchor=CENTER)
label = Label(root)
label.pack()
root.mainloop()

Python Tiago Cruz de Frana 50


Componentes
Scrollbar
Rolamento para widgets com superfcie til varivel (Text, Canvas, Entry, Listbox)

from Tkinter import *

root = Tk()
scrollbar = Scrollbar(root)
scrollbar.pack( side = RIGHT, fill=Y )

mylist = Listbox(root, yscrollcommand = scrollbar.set )


for line in range(100):
mylist.insert(END, "This is line number " + str(line))

mylist.pack( side = LEFT, fill = BOTH )


scrollbar.config( command = mylist.yview )

mainloop()

Python Tiago Cruz de Frana 51


Componentes
Text
Exibe e permite editar texto formatado. Tambm suporta imagens
e janelas embutidas

text = Text(root)
text.insert(INSERT, "Hello.....")
text.insert(END, "Bye Bye.....")
text.pack()

text.tag_add("here", "1.0", "1.4")


text.tag_add("start", "1.8", "1.13")
text.tag_config("here", background="yellow", foreground="blue")
text.tag_config("start", background="black", foreground="green")

Python Tiago Cruz de Frana 52


Componentes
Toplevel
Uma janela separada

from Tkinter import *

root = Tk()
top1 = Toplevel()
top2 = Toplevel(bg="black")

mainloop()

Python Tiago Cruz de Frana 53


Classe Tk

Define janela principal e interpretador Tcl


Geralmente essa classe no precisa ser instanciada
instanciada automaticamente quando um widget filho criado
Se desejar, pode instanciar a classe de forma explcita
Possui vrios mtodos
Ex: title (string) - Especifica o ttulo da janela
Ex: geometry(string) - Especifica tamanho e posio da janela

Python Tiago Cruz de Frana 54


Exemplo

Ttulo no topo da tela

Largura, altura e
posicionamento x e y na tela

Python Tiago Cruz de Frana 55


Sada

Python Tiago Cruz de Frana 56


Opes de Widgets

Widgets (elementos de interface) tm opes com


nomenclatura unificada.
Ex.:
text Texto mostrado no elemento
background cor de fundo
foreground cor do texto
font fonte do texto
relief relevo da borda ('flat', 'raised', 'ridge', 'sunken', 'groove')

Python Tiago Cruz de Frana 57


Opes de Widgets

Formas de se especificar opes


Atravs do construtor
Ou usando o mtodo configure

Python Tiago Cruz de Frana 58


Mais Exemplo

Python Tiago Cruz de Frana 59


Gerenciador Pack

Sintaxe: pack(opes)
Espao do pai uma rea a ser preenchida pelos filhos
Empacota elementos filhos ao pai
Usa lado especificado pelo desenvolvedor
Os lados possveis so 'top', 'left', 'right' e 'bottom'

Python Tiago Cruz de Frana 60


Exemplo

Python Tiago Cruz de Frana 61


Redimensionando

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 ('none', 'x', 'y' ou 'both')
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)

Python Tiago Cruz de Frana 62


Exemplo de Redimensionamento

Python Tiago Cruz de Frana 63


Exerccio 1 (executar e maximizar janela)

from Tkinter import *

top = Frame()
top.pack(fill='both', expand=True)
a = Label (top, text="A")
a.pack(side="left",fill="y")
b = Label (top, text="B")
b.pack (side="bottom",fill="x")
c = Label (top, text="C")
c.pack (side="right")
d = Label (top, text="D")
d.pack (side="top")

for widget in (a,b,c,d):


widget.configure(relief="groove", border=10, font="Times 24 bold")

top.mainloop()

Python Tiago Cruz de Frana 64


Exerccio 2 (executar e maximizar janela)

from Tkinter import *

top = Frame()
top.pack(fill='both', expand=True)
a = Label (top, text="A)
a.Pack (side="left",expand=True,fill="y")
b = Label (top, text="B)
b.Pack (side="bottom",expand=True,fill="both")
c = Label (top, text="C")
c.pack (side="right)
d = Label (top, text="D")
d.pack (side="top")

for widget in (a,b,c,d):


widget.configure(relief="groove", border=10, font="Times 24 bold")

top.mainloop()

Python Tiago Cruz de Frana 65


Usando Frames para Auxiliar Layout
Exerccio 3: executar e ampliar janela

from Tkinter import *

top = Frame() ; top.pack(fill='both', expand=True)


f = Frame (top); f.pack (fill='x')
a = Label (f, text="A")
b = Label (f, text="B")
c = Label (f, text="C")
d = Label (top, text="D")

for w in (a,b,c,d):
w.configure(relief="groove", border=10, font="Times 24 bold")
w.pack(side="left", expand=True, fill="both")

top.mainloop()

Python Tiago Cruz de Frana 66


Programao com Eventos

Sistema pode controlar o programa


No Tk, mainloop
Eventos
Clique em item do menu, ou no boto
Arrastado do mouse sobre janela
Alterar valor de caixa de texto
Para tratar os eventos, se usa o Callback

Python Tiago Cruz de Frana 67


Programao com Eventos - command

Principais componentes do Tk possuem a opo


command
Command indica qual funo a ser invocada sempre que o
widget acionado
Tipicamente, a funo (ou mtodo) usado obtm valores
de outros widgets para realizar alguma operao

Python Tiago Cruz de Frana 68


Exemplo
Execute e clique no boto

from Tkinter import *

def inc():
n=int(rotulo.configure("text")[4])+1
rotulo.configure(text=str(n))

b = Button(text="Incrementa",command=inc)
b.pack()
rotulo = Label(text="0")
rotulo.pack()
mainloop()

Python Tiago Cruz de Frana 69


Eventos e Bind

Tratando eventos de Widgets sem command


Uso do metodo bind que permite especificar um padro de
eventos ao qual o widget ser sensvel e uma rotina
callback para trat-lo
bind (padrao, 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

Python Tiago Cruz de Frana 70


Exemplo

Clicar sobre a janela


para testar

from Tkinter import *

def clica (e):


txt = "Mouse clicado em\n%d,%d"%(e.x,e.y)
r.configure(text=txt)

r = Label()
r.pack(expand=True, fill="both")
r.master.geometry("200x200")
r.bind("<Button-1>", clica)
mainloop()

Python Tiago Cruz de Frana 71


Campos do objeto evento

x,y : posio do mouse com relao ao canto superior esquerdo


do widget
x_root, y_root: posio do mouse com relao ao canto superior
esquerdo da tela
char: caractere digitado (eventos de teclado)
keysym: representao simblica da tecla
keycode: representao numrica da tecla
num: nmero do boto 1/2/3=Esquerdo/Meio/Direito
(eventos de mouse)
widget: o objeto que gerou o evento
width,height: largura e altura do widget (evento Configure)

Python Tiago Cruz de Frana 72


Padres de evento (mouse)

<Button-i> para i = 1,2,3: boto i do mouse pressionado


sobre o widget
<Motion> : mouse arrastado sobre o widget
<Bi-Motion> : mouse arrastado sobre o widget com o boto i
pressionado
<ButtonRelease-i> : boto i do mouse solto sobre o widget
<Double-Button-i>: boto i do mouse clicado duas vezes em
seguida
<Enter>: O mouse entrou na rea do widget
<Leave>: O mouse saiu da rea do widget

Python Tiago Cruz de Frana 73


Padres de evento (teclado)

caracter : O caracter foi digitado sobre o widget


<Key>: Algum caracter foi digitado sobre o widget
<Return>: Tecla enter foi digitada
<Tab>, <F1>, <Up>...: A tecla correspondente foi digitada
<Shift-Tab>, <Alt-F1>, <Ctrl-Up>...: 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

Python Tiago Cruz de Frana 74


Exemplo
clicar e teclar algo sobre o foco tem que ser o widget

from Tkinter import *

def clica (e):


txt = "Mouse clicado em\n%d,%d"%(e.x,e.y)
r.configure(text=txt)
r.focus()

def tecla(e):
txt="Keysym=%s\nKeycode=%s\nChar=%s"%(e.keysym,e.keycode,e.char)
r.configure(text=txt)

r = Label()
r.pack(expand=True, fill="both")
r.master.geometry("200x200")
r.bind("<Button-1>", clica)
r.bind("<Key>", tecla)
mainloop()

Python Tiago Cruz de Frana 75


Menus

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
checkbox 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)
Python Tiago Cruz de Frana 76
Menu de janela (toplevel)

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.

Python Tiago Cruz de Frana 77


Exemplo
Clique na opo Arquivo

from Tkinter import *

def abrir(): print "abrir"


def salvar(): print "salvar"
def ajuda(): print "ajuda"

top=Tk()
principal=Menu(top)
top.configure(menu=principal)

arquivo=Menu(principal)
arquivo.add_command(label="Abrir",command=abrir)
arquivo.add_command(label="Salvar",command=salvar)

principal.add_cascade(label="Arquivo",menu=arquivo)
principal.add_command(label="Ajuda",command=ajuda)

mainloop()

Python Tiago Cruz de Frana 78


Menu Popup

Um menu popup aquele que exibido numa


janela independente
Para que o menu seja exibido, preciso invocar o
mtodo post:
post (x, y)
Onde x e y so as coordenadas do canto superior esquerdo do
menu com relao ao canto superior esquerdo da tela

Python Tiago Cruz de Frana 79


Exemplo
Tente rodar e clicar com o btn direito do mouse

from Tkinter import *

def alo():
print "Alo!"

root = Tk()
menu = Menu(root, tearoff=0)
menu.add_command(label="Alo 1", command=alo)
menu.add_command(label="Alo 2", command=alo)

def popup(e):
menu.post(e.x_root, e.y_root)

frame = Frame(root, width=200, height=200)


frame.pack()
frame.bind("<Button-3>", popup)
mainloop()

Python Tiago Cruz de Frana 80


Variveis

Quem controla o Tk o interpretador Tcl


No o Python quem controla ele diretamente

Em alguns casos, deseja-se 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

Python Tiago Cruz de Frana 81


Variveis

Variveis Tcl so expostas aplicao Python


atravs das classes StringVar, IntVar e DoubleVar
O construtor da forma StringVar(master) onde master
uma janela ou widget

Instncias dessas classes possuem os mtodos get e


set que podem ser usados para acessar os valores
armazenados no interpretador Tcl

Python Tiago Cruz de Frana 82


Exemplo
Rode o cdigo e veja voc mesmo

from Tkinter import *


root = Tk()
soma = DoubleVar(root)
parcela = DoubleVar(root)

def aritmetica (e):


soma.set(soma.get()+parcela.get())

lsoma = Label(textvar=soma)
eparcela = Entry(textvar=parcela)
eparcela.bind("<Return>", aritmetica)
lsoma.pack()
eparcela.pack()
mainloop()

Python Tiago Cruz de Frana 83


Checkbuttons

Checkbutton Representa uma varivel que pode ter


dois valores distintos (tipicamente um valor
booleano)
O valor alterado quando se clica no boto
A callback especificada pela opo command cha
mada sempre que a varivel muda de valor
Estado armazenado pela varivel Tcl especificada
pela opo variable
Python Tiago Cruz de Frana 84
Checkbuttons

Se a varivel inteira, o valor correspondente ao ch


eckbutton desligado/ligado 0/1

possvel usar um checkbutton com uma varivel st


ring
Nesse caso, os valores correspondentes a desligado/lig-
ado so especificados com as opes offvalue e onvalue

Python Tiago Cruz de Frana 85


Exemplo
from Tkinter import *

root = Tk()
v1 = IntVar(root)
v2 = StringVar(root)

def exibe():
l.config (text="v1=%d,v2=%s"%(v1.get(),v2.get()))

c1 = Checkbutton (text="V1", var=v1, command=exibe)


c2 = Checkbutton (text="V2", var=v2, command=exibe,
onvalue="Sim", offvalue="Nao")

l = Label()

for w in (c1,c2,l):
w.pack()

exibe()
mainloop()
Python Tiago Cruz de Frana 86
Radiobuttons

Radiobutton 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

Python Tiago Cruz de Frana 87


Radiobuttons

Um radiobutton mostrado com um indicador ao


lado
Pode-se desabilitar o indicador usando a opo
indicatoron=False
Nesse caso, mostrado como um boto normal

Python Tiago Cruz de Frana 88


Exemplo
from Tkinter import *

root=Tk()
cor = StringVar(root)
cor.set("black")
l = Label(background=cor.get())
l.pack(fill='both',expand=True)

def pinta():
l.configure(background=cor.get())

for txt,val in (("preto","black"),


("vermelho","red"),
("azul","blue"),
("verde","green")):

Radiobutton(text=txt,value=val,variable=cor,command=pinta).pack(anchor=W)

mainloop()

Python Tiago Cruz de Frana 89


Exerccio

Substitua os radiobuttons do exemplo anterior por


botes.

Python Tiago Cruz de Frana 90


Resposta
from Tkinter import *

root=Tk()
cor = StringVar(root)
cor.set("black")
l = Label(background=cor.get())
l.pack(fill='both',expand=True)

def pinta():
l.configure(background=cor.get())

for txt,val in (("preto","black"),


("vermelho","red"),
("azul","blue"),
("verde","green")):
Radiobutton(text=txt,value=val,variable=cor,
command=pinta,indicatoron=False).pack(fill='x')

mainloop()

Python Tiago Cruz de Frana 91


Entry

Um Entry 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()

Python Tiago Cruz de Frana 92


Entry

H diversos mtodos para manipular diretamente o


texto
Usam o conceito de ndices
Por exemplo, o ndice INSERT indica a posio do texto onde o
cursor de insero se encontra, sendo 0 a posio antes do
primeiro caractere e END a posio ao final do texto

Python Tiago Cruz de Frana 93


Exemplo

from Tkinter import *

def insere():
e.insert(INSERT,"*")

def limpa():
e.delete(INSERT,END)

e=Entry(font="Arial 24")
i=Button(text="Insere*",command=insere)
l=Button(text="Limpa",command=limpa)
e.pack()

for w in (i,l):
w.pack(side='left')

mainloop()

Python Tiago Cruz de Frana 94


Scrollbar

Barras de rolamento so usadas com outros widgets co


m rea til maior do que pode ser exibida na janela
(Canvas, Text, Listbox, Entry)
Uma barra de rolamento horizontal (vertical) funciona
chamando o mtodo xview (yview) 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
yscrollcommand) do widget ao mtodo set da barra

Python Tiago Cruz de Frana 95


Exemplo

from Tkinter import *

lb = Listbox()
lb.pack(side=LEFT,expand=True,fill="both")
sb = Scrollbar()
sb.pack(side=RIGHT,fill="y")
sb.configure(command=lb.yview)
lb.configure(yscrollcommand=sb.set)

for i in range(100):
lb.insert(END,i)

mainloop()

Python Tiago Cruz de Frana 96


Canvas

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
image imagem colorida
line linha poligonal
oval crculos e elipses
polygon polgonos
rectangle retngulo
text texto
window um widget tk

Python Tiago Cruz de Frana 97


Exemplo
execute e veja (coloque uma img no mesmo diretrio do cdigo)
from Tkinter import *

c = Canvas()
c.pack()

o = c.create_oval(1,1,200,100,outline="blue",
width=5,fill="red")
widget = Button(text="Tk Canvas")
w = c.create_window(10,120,window=widget,anchor=W)
l = c.create_line(100,0,120,30,50,60,100,120,
fill="black",width=2)
r = c.create_rectangle(40,150,100,200,fill="white")
img = PhotoImage(file="./NelsonHaha2.gif")
i = c.create_image (150,150,image=img,anchor=NW)
a = c.create_arc (150,90,250,190,start=30,extent=60,
outline="green",fill="orange")
t = c.create_text(200,35,text="Texto\nTexto",
font="Arial 22")

mainloop()
Python Tiago Cruz de Frana 98
Coordenadas de Itens

Todos os mtodos create_item tm como primeiros


argumentos um par de coordenadas x,y do item
Os itens oval e rectangle requerem mais um par de
coordenadas para delimitar a extenso (caixa envolvente)
Os itens line e polygon podem ser seguidos por outros
pares de coordenadas que especificam demais vrtices

Python Tiago Cruz de Frana 99


Coordenadas de Itens

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
canvasy(y)

Python Tiago Cruz de Frana 100


Refercias

Python para Desenvolvedores, 2 Ed.


Paulo Roma, UFRJ. http://orion.lcg.ufrj.br/python/

Python Tiago Cruz de Frana 115