SlideShare une entreprise Scribd logo
1  sur  92
Télécharger pour lire hors ligne
Python:
Interfaces Gráficas com Tk



       Claudio Esperança
Interfaces Gráficas
 Também chamadas de Graphical User Interfaces (GUI)
 Usadas em aplicações modernas que requerem uma interação
  constante com o usuário
    Maior usabilidade e naturalidade do que interfaces textuais
 Aplicação apresenta uma ou mais janelas com elementos
  gráficos que servem para comandar ações, especificar
  parâmetros, desenhar e exibir gráficos, etc
 Bibliotecas (toolkits) para construção de interfaces como
    Qt
    Gtk
    wxWindows
    Tk
Interfaces Gráficas em Python
 Python possui camadas de portabilidade (bindings) para
  várias bibliotecas de construção de interfaces. Ex.:
      PyQt (Qt)
      PyGtk (Gtk)
      wxPython (wxWindows)
      Tkinter (Tk)
 Multiplataforma (MS-Windows, Unix/Linux, OSX)
Tk
 Toolkit originalmente criado para utilização com a
  linguagem script Tcl
 Bastante leve, portátil e robusto
 Um tanto obsoleto frente a outros toolkits mais modernos
  como Qt ou Gtk
 Camada Tkinter normalmente distribuída com o Python
      Inicia um processo Tcl que toma conta dos elementos de
       interface
      Classes e funções do Tkinter se comunicam com o
       interpretador Tcl para especifcar aspecto e comportamento
       da interface
Usando Tkinter
 Importar o módulo Tkinter
    from Tkinter import *
 Elementos de interface (widgets) correspondem a objetos
  de diversas classes. Por exemplo:
      Frame (Área retangular)
      Button (botão)
      Label (rótulo)
      Text (caixa de texto)
      Canvas (caixa de desenho)
 Posição e tamanho dos elementos controlados por
  gerentes de geometria
      Pack (mais comum),      Place, Grid
Usando Tkinter (2)
 Para criar um widget, tem-se que informar o widget-pai
  (parâmetro master) onde geometricamente deverá ser
  encaixado e as opções de configuração para o widget. Ex.:
    w =
     Button(pai,text=”Cancelar”,command=cancelar)
 Tk já define por default uma janela principal
    master=None (default) indica que o widget será filho da
     janela principal
    Outras janelas pode ser criadas criando objetos da classe
     Toplevel
 A função mainloop tem que ser invocada para que a
  aplicação entre no modo de tratamento de eventos
Exemplo
from Tkinter import *

class Application(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.msg = Label(self, text="Hello World")
        self.msg.pack ()
        self.bye = Button (self, text="Bye", command=self.quit)
        self.bye.pack ()
        self.pack()

app = Application()
mainloop()
Exemplo
from Tkinter import *

class Application(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.msg = Label(self, text="Hello World")
        self.msg.pack ()
        self.bye = Button (self, text="Bye", command=self.quit)
        self.bye.pack ()
        self.pack()

app = Application()
mainloop()
Exemplo
from Tkinter import * Elemento principal derivado de Frame

class Application(Frame):
                                        Construtor da classe base
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.msg = Label(self, text="Hello World")
        self.msg.pack ()
        self.bye = Button (self, text="Bye", command=self.quit)
        self.bye.pack ()
        self.pack()                    Janela tem um rótulo e um botão

                            Interface é instanciada
app = Application()
mainloop()


                     Laço de tratamento de eventos é iniciado
Classes de componentes
 Button Um botão simples usado para executar um comando
 Canvas Provê facilidades de gráficos estruturados
 Checkbutton Representa uma variável que pode ter dois
    valores distintos (tipicamente um valor booleano). Clicando no
    botão alterna-se entre os valores
   Entry 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.)
 Menu Um painel de menu. Implementa menus de janela, pulldowns e
    popups
   Message Similar ao widget Label, mas tem mais facilidade para
    mostrar texto quebrado em linhas
   Radiobutton Representa um possível valor de uma variável que
    tem um de muitos valores. Clicando o botão, a variável assume
    aquele valor
   Scale Permite especificar um valor numérico através de um ponteiro
    em uma escala linear
   Scrollbar Barra de rolamento para widgets que têm superfície útil
    variável (Text, Canvas, Entry, Listbox)
   Text Exibe e permite editar texto formatado. Também suporta
    imagens e janelas embutidas
   Toplevel Uma janela separada
A 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 vários métodos, entre os quais
    title (string) Especifica o título da janela
    geometry(string) Especifica tamanho e posição da janela
         String tem a forma larguraxaltura+x+y
Exemplo
from Tkinter import *

class Application(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.msg = Label(self, text="Hello World")
        self.msg.pack ()
        self.bye = Button (self, text="Bye", command=self.quit)
        self.bye.pack ()
        self.pack()

app = Application()
app.master.title("Exemplo")
app.master.geometry("200x200+100+100")
mainloop()
Opções de Widgets
 Widgets (elementos de interface) têm opções 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')
 Opções são especificadas
   No construtor
   Através do método configure
Exemplo
from Tkinter import *
top = Frame() ; top.pack()
rotulo = Label (top, text="Rótulo Exemplo",
  foreground="blue")
rotulo.pack ()
rotulo.configure(relief="ridge", font="Arial 24 bold",
  border=5, background="yellow")
O método configure
 Usado com pares do tipo opção=valor, modifica os valores dos
  atributos
 Usado com uma string “nomeopção” retorna a configuração da
  opção com esse nome
    A configuração é 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 opção
         valor corrente da opção
 Se configure é usado sem argumentos, retorna um
  dicionário com todas as opções
 Pode-se obter diretamente o valor de uma opção usando
  o método cget
Exemplo
>>> rotulo.configure(relief="ridge")
>>> rotulo.configure("relief")
('relief', 'relief', 'Relief', <index object at
  0x85f9530>, 'ridge')
>>> rotulo.configure()["relief"]
('relief', 'relief', 'Relief', <index object at
  0x85f9530>, 'ridge')
>>> rotulo.configure("relief")[4]
'ridge'
>>> rotulo.cget("relief")
'ridge'
Gerenciando geometrias
 Todos os elementos de interface ocupam uma área
  retangular na janela
 A posição e tamanho de cada elemento é determinada
  por um gerenciador de geometria
      O elemento não “aparece” enquanto não for informado ao
       gerenciador
 A geometria resultante depende de
    Propriedades dos elementos (tamanho mínimo, tamanho da
     moldura, etc)
    Opções do gerenciador
    Algoritmo usado pelo gerenciador
 O gerenciador mais usado em Tk é o pack
Usando o pack
 Para informar que um elemento deve ser gerenciado pelo
  pack, use o método pack (opções)
 O pack considera o espaço 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 possíveis são 'top', 'left', 'right' e 'bottom'
      Deve-se imaginar que sempre que um elemento filho
       escolhe um lado, a cavidade disponível fica restrita ao lado
       oposto
Exemplo
from Tkinter import *
top = Frame() ; top.pack()
a = Label (top, text="A") ; a.pack (side="left")
b = Label (top, text="B") ; b.pack (side="bottom")
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()
Redimensionamento
 Por default, o pack não redimensiona os filhos quando o
  pai é redimensionado
 Duas opções controlam o redimensionamento dos filhos
      expand (booleano)
           Se verdadeiro, indica que o filho deve tomar toda a cavidade
            disponível no pai
           Caso contrário, toma apenas o espaço necessário (default)
      fill ('none', 'x', 'y' ou 'both')
           Indica como o desenho do elemento irá preencher o espaço
            alocado
           'x' / 'y' indica que irá preencher a largura / altura
           'both' indica preenchimento de todo o espaço
           'none' indica que apenas o espaço necessário será ocupado
            (default)
Exemplo
from Tkinter import *
top = Frame() ; top.pack()
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()
Exemplo
from Tkinter import *
top = Frame() ; top.pack()
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()
Exemplo
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()
Exemplo
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()
Exemplo
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()
Exemplo
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()
Usando frames
 Frames podem ser usados para auxiliar no layout dos
  elementos com pack. Ex.:
   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()
Usando frames
 Frames podem ser usados para auxiliar no layout dos
  elementos com pack. Ex.:
   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()
Programação com eventos
 Diferente da programação convencional
 O programa não está sob controle 100% do tempo
    Programa entrega controle ao sistema
    Em Tk: método(função) mainloop
 Interação gera eventos. Ex:
    Acionamento de um menu ou de um botão
    Mouse arrastado sobre uma janela
    Uma caixa de texto teve seu valor alterado
 O tratamento de um evento é feito por uma rotina
  “Callback”
A opção command
 Muitos componentes do Tk suportam a opção command
  que indica uma função a ser invocada sempre que o
  widget é acionado
 Tipicamente, a função (ou método) usado obtém valores
  de outros widgets para realizar alguma operação
Exemplo
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()
r = Label(text="0")
r.pack()
mainloop()
Exemplo
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()
r = Label(text="0")
r.pack()
mainloop()
Exemplo
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()
r = Label(text="0")
r.pack()
mainloop()
Eventos e Bind
 Widgets que não dispõem da opção command também
  podem receber eventos e responder a eles
 O método bind permite especificar um padrão de
  eventos ao qual o widget será sensível e uma rotina
  callback para tratá-lo
   bind(padrão,rotina)
    padrão é uma string que descreve quais eventos a rotina irá
     tratar
    rotina é uma função ou método com exatamente um
     parâmetro: o evento que deve ser tratado
Exemplo
from Tkinter import *

def clica (e):
    txt = "Mouse clicado emn%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()
Exemplo
from Tkinter import *

def clica (e):
    txt = "Mouse clicado emn%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()
Exemplo
from Tkinter import *

def clica (e):
    txt = "Mouse clicado emn%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()
Campos do objeto evento
 x,y : posição do mouse com relação ao canto superior
    esquerdo do widget
   x_root, y_root: posição do mouse com relação ao canto
    superior esquerdo da tela
   char: caractere digitado (eventos de teclado)
   keysym: representação simbólica da tecla
   keycode: representação numérica da tecla
   num: número do botão – 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)
Padrões de evento (mouse)
 <Button-i> para i = 1,2,3: botão i do mouse pressionado
    sobre o widget
   <Motion> : mouse arrastado sobre o widget
   <Bi-Motion> : mouse arrastado sobre o widget com o botão i
    pressionado
   <ButtonRelease-i> : botão i do mouse solto sobre o widget
   <Double-Button-i>: botão i do mouse clicado duas vezes
    em seguida
   <Enter>: O mouse entrou na área do widget
   <Leave>: O mouse saiu da área do widget
Padrões 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 forçado usando o método
     focus
Exemplo
from Tkinter import *
def clica (e):
    txt = "Mouse clicado emn%d,%d"%(e.x,e.y)
    r.configure(text=txt)
    r.focus()
def tecla(e):
    txt="Keysym=%snKeycode=%snChar=%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)
Exemplo
from Tkinter import *
def clica (e):
    txt = "Mouse clicado emn%d,%d"%(e.x,e.y)
    r.configure(text=txt)
    r.focus()
def tecla(e):
    txt="Keysym=%snKeycode=%snChar=%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)
Exemplo
from Tkinter import *
def clica (e):
    txt = "Mouse clicado emn%d,%d"%(e.x,e.y)
    r.configure(text=txt)
    r.focus()
def tecla(e):
    txt="Keysym=%snKeycode=%snChar=%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)
Exemplo
from Tkinter import *
def clica (e):
    txt = "Mouse clicado emn%d,%d"%(e.x,e.y)
    r.configure(text=txt)
    r.focus()
def tecla(e):
    txt="Keysym=%snKeycode=%snChar=%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)
Exemplo
from Tkinter import *
def clica (e):
    txt = "Mouse clicado emn%d,%d"%(e.x,e.y)
    r.configure(text=txt)
    r.focus()
def tecla(e):
    txt="Keysym=%snKeycode=%snChar=%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)
Menus
 Podem ser associados a uma janela (menus toplevel),
  pulldown, popup e em cascata a partir de outro menu
 Todos são instâncias 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
       vários estados mutuamente exclusivos
      cascade ativa um outro menu em cascata
 Para adicionar um item a um menu, use métodos da
  forma add (“tipo”, opções) ou add_tipo(opções)
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, não necessita ter sua
  geometria gerenciada (e.g., pack ou grid)
 Para associar a uma janela, usa-se a opção menu do
  objeto janela.
Exemplo
from Tkinter import *
def abrir(): print "abrir"
def salvar(): print "salvar"
def ajuda() : print "ajuda"
top=Tk()
principal=Menu(top)
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)
top.configure(menu=principal)
Exemplo
from Tkinter import *
def abrir(): print "abrir"
def salvar(): print "salvar"
def ajuda() : print "ajuda"
top=Tk()
principal=Menu(top)
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)
top.configure(menu=principal)
Exemplo
from Tkinter import *
def abrir(): print "abrir"
def salvar(): print "salvar"
def ajuda() : print "ajuda"
top=Tk()
principal=Menu(top)
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)
top.configure(menu=principal)
Menus Popup
 Um menu popup é aquele que é exibido numa janela
  independente
 Para que o menu seja exibido, é preciso invocar o método
  post:
   post (x, y)
    onde x e y são as coordenadas do canto superior esquerdo
     do menu com relação ao canto superior esquerdo da tela
Exemplo
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()
Exemplo
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()
Variáveis
 Tk é controlado por um interpretador Tcl (e não
  diretamente pelo python)
 Em alguns casos, deseja-se usar usar variáveis na
  interface
      Por exemplo, é possível especificar que o texto exibido em
       um Label é o valor de uma variável (e não uma constante)
           Nesse caso, usa-se a opção textvar ao inves de text
 Variáveis Tcl são expostas à aplicaçãoPython através das
  classes StringVar, IntVar e DoubleVar
    O construtor é da forma StringVar(master) onde
       master é uma janela ou widget
 Instâncias dessas classes possuem os métodos get e
  set que podem ser usados para acessar os valores
  armazenados no interpretador Tcl
Exemplo
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()
Exemplo
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()
Exemplo
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()
Exemplo
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()
Checkbuttons
 Checkbutton Representa uma variável que pode ter dois
    valores distintos (tipicamente um valor booleano). Clicando no
    botão alterna-se entre os valores
   A callback especificada pela opção command é chamada
    sempre que a variável muda de valor
   Estado é armazenado pela variável Tcl especificada pela
    opção variable
   Se a variável é inteira, o valor correspondente ao checkbutton
    “desligado”/“ligado” é 0/1
   É possível usar um checkbutton com uma variável string
      Nesse caso, os valores correspondentes a
       “desligado”/“ligado” são especificados com as opções
       offvalue e onvalue
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()
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()
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()
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()
Radiobuttons
 Radiobutton representa um possível valor de uma variável
  que tem um de muitos valores. Clicando o botão, a variável
  assume aquele valor
 A variável é especificada com a opção variable e o valor
  associado com a opção value
 Os radiobuttons que se referem à mesma variável 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 botão normal
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()
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()
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()
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()
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,indicatoron=False).pack(fill='x')
mainloop()
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,indicatoron=False).pack(fill='x')
mainloop()
Entry
 Um Entry permite entrada/edição de uma linha de texto
 O texto associado ao Entry é normalmente armazenado
  numa variável indicada pela opção textvariable
      Se não indicada, é usada uma variável interna cujo
       valor pode ser obtido usando o método get()
 Há diversos métodos para manipular diretamente o
  texto
      Usam o conceito de índices (não confundir com os
       índices usado pelo Python)
      Por exemplo, o índice INSERT indica a posição do
       texto onde o cursor de inserção se encontra, 0 a
       posição antes do primeiro caractere e END a posição
       ao final do texto
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()
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()
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()
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()
Canvas
 Permite a exibição e edição de gráficos estruturados 2D
 Elementos gráficos (itens) são introduzidos usando
  métodos da forma create_tipo (...), onde tipo pode ser
      arc arco de círculo
      bitmap imagem binária
      image imagem colorida
      line linha poligonal
      oval círculos e elipses
      polygon polígonos
      rectangle retângulo
      text texto
      window um widget tk
Exemplo
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="python.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="TextonTexto",
      font="Arial 22")
Exemplo
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="python.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="TextonTexto",
      font="Arial 22")
Coordenadas de Itens
 Todos os métodos create_item têm 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 extensão (caixa envolvente)
    Os itens line e polygon podem ser seguidos por outros
     pares de coordenadas que especificam demais vértices
 As coordenadas referem-se a um sistema de coordenadas
  próprio que pode ser diferente do da janela
    A área do canvas que deve ser mostrada na janela pode
     ser modificada pela opção
     scrollarea=(xmin,ymin,xmax,ymax)
    Para obter as coordenadas do canvas dadas as
     coordenadas da janela usa-se os métodos canvasx(x) e
     canvasy(y)
Identificação de Itens
 Todo item de um canvas tem um identificador numérico
  que é retornado pelo método create_item
 Pode-se também associar tags (etiquetas) a itens
      Usa-se a opção tags=tags onde tags pode ser uma string
       ou uma tupla com várias 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
Métodos de Canvas
 itemconfig (itemOuTag, ...) altera opções do(s) item(s)
 tag_bind(itemOuTag, padrão, callback) associa uma callback
    a um padrão 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
   itemcget(item,opção) retorna o valor da opção dada do item
Exemplo
from Tkinter import *
c = Canvas()
c.pack()
def novalinha(e):
    x,y = c.canvasx(e.x), c.canvasy(e.y)
    c.create_line(x,y,x,y,tags="corrente")
def estendelinha(e):
    x,y = c.canvasx(e.x), c.canvasy(e.y)
    coords = c.coords("corrente") + [x,y]
    c.coords("corrente",*coords)
def fechalinha(e): c.itemconfig("corrente",tags=())
c.bind("<Button-1>", novalinha)
c.bind("<B1-Motion>", estendelinha)
c.bind("<ButtonRelease-1>", fechalinha)
c.pack()
Exemplo
from Tkinter import *
c = Canvas()
c.pack()
def novalinha(e):
    x,y = c.canvasx(e.x), c.canvasy(e.y)
    c.create_line(x,y,x,y,tags="corrente")
def estendelinha(e):
    x,y = c.canvasx(e.x), c.canvasy(e.y)
    coords = c.coords("corrente") + [x,y]
    c.coords("corrente",*coords)
def fechalinha(e): c.itemconfig("corrente",tags=())
c.bind("<Button-1>", novalinha)
c.bind("<B1-Motion>", estendelinha)
c.bind("<ButtonRelease-1>", fechalinha)
c.pack()
Exemplo
from Tkinter import *
c = Canvas()
c.pack()
def novalinha(e):
    x,y = c.canvasx(e.x), c.canvasy(e.y)
    c.create_line(x,y,x,y,tags="corrente")
def estendelinha(e):
    x,y = c.canvasx(e.x), c.canvasy(e.y)
    coords = c.coords("corrente") + [x,y]
    c.coords("corrente",*coords)
def fechalinha(e): c.itemconfig("corrente",tags=())
c.bind("<Button-1>", novalinha)
c.bind("<B1-Motion>", estendelinha)
c.bind("<ButtonRelease-1>", fechalinha)
c.pack()
Exemplo
from Tkinter import *
c = Canvas()
c.pack()
def novalinha(e):
    x,y = c.canvasx(e.x), c.canvasy(e.y)
    c.create_line(x,y,x,y,tags="corrente")
def estendelinha(e):
    x,y = c.canvasx(e.x), c.canvasy(e.y)
    coords = c.coords("corrente") + [x,y]
    c.coords("corrente",*coords)
def fechalinha(e): c.itemconfig("corrente",tags=())
c.bind("<Button-1>", novalinha)
c.bind("<B1-Motion>", estendelinha)
c.bind("<ButtonRelease-1>", fechalinha)
c.pack()
Exemplo
...
def selecionalinha(e):
    global x0,y0
    x0,y0 = c.canvasx(e.x), c.canvasy(e.y)
    c.itemconfig(CURRENT, tags="sel")
def movelinha (e):
    global x0,y0
    x1,y1 = c.canvasx(e.x), c.canvasy(e.y)
    c.move("sel",x1-x0,y1-y0)
    x0,y0=x1,y1
def deselecionalinha(e): c.itemconfig("sel", tags=())
c.bind("<Button-3>", selecionalinha)
c.bind("<B3-Motion>", movelinha)
c.bind("<ButtonRelease-3>", deselecionalinha)
Exemplo
...
def selecionalinha(e):
    global x0,y0
    x0,y0 = c.canvasx(e.x), c.canvasy(e.y)
    c.itemconfig(CURRENT, tags="sel")
def movelinha (e):
    global x0,y0
    x1,y1 = c.canvasx(e.x), c.canvasy(e.y)
    c.move("sel",x1-x0,y1-y0)
    x0,y0=x1,y1
def deselecionalinha(e): c.itemconfig("sel", tags=())
c.bind("<Button-3>", selecionalinha)
c.bind("<B3-Motion>", movelinha)
c.bind("<ButtonRelease-3>", deselecionalinha)
Exemplo
...
def selecionalinha(e):
    global x0,y0
    x0,y0 = c.canvasx(e.x), c.canvasy(e.y)
    c.itemconfig(CURRENT, tags="sel")
def movelinha (e):
    global x0,y0
    x1,y1 = c.canvasx(e.x), c.canvasy(e.y)
    c.move("sel",x1-x0,y1-y0)
    x0,y0=x1,y1
def deselecionalinha(e): c.itemconfig("sel", tags=())
c.bind("<Button-3>", selecionalinha)
c.bind("<B3-Motion>", movelinha)
c.bind("<ButtonRelease-3>", deselecionalinha)
Scrollbar
 Barras de rolamento são usadas com outros widgets com
  área útil maior do que pode ser exibida na janela
  (Canvas, Text, Listbox, Entry)
 Uma barra de rolamento horizontal (vertical) funciona
  chamando o método xview (yview) do widget
  associado
      Isto é feito configurando a opção command da barra
 Por outro lado, sempre que a visão do widget muda, a
  barra de rolamento precisa ser atualizada
      Isto é feito configurando a opção xscrollcommand (ou
       yscrollcommand) do widget ao método set da barra
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)
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)

Contenu connexe

Tendances

Introdução a Linguagem Java
Introdução a Linguagem JavaIntrodução a Linguagem Java
Introdução a Linguagem JavaUFPA
 
Aula 1 - Introdução a POO
Aula 1 -  Introdução a POOAula 1 -  Introdução a POO
Aula 1 - Introdução a POODaniel Brandão
 
Apostila de Fundamentos Java
Apostila de Fundamentos JavaApostila de Fundamentos Java
Apostila de Fundamentos JavaMarcio Marinho
 
Java básico - Módulo 04: Estruturas de controle
Java   básico - Módulo 04:  Estruturas de controleJava   básico - Módulo 04:  Estruturas de controle
Java básico - Módulo 04: Estruturas de controleProfessor Samuel Ribeiro
 
Aula 04 PHP - Utilizando Funções e Manipulando Arquivos
Aula 04 PHP - Utilizando Funções e Manipulando ArquivosAula 04 PHP - Utilizando Funções e Manipulando Arquivos
Aula 04 PHP - Utilizando Funções e Manipulando ArquivosDaniel Brandão
 
Mock objects - Teste de código com dependências
Mock objects - Teste de código com dependênciasMock objects - Teste de código com dependências
Mock objects - Teste de código com dependênciasDenis L Presciliano
 
Prototipação de software
Prototipação de softwarePrototipação de software
Prototipação de softwareleopp
 
Troca de contexto segura em sistemas operacionais embarcados utilizando técni...
Troca de contexto segura em sistemas operacionais embarcados utilizando técni...Troca de contexto segura em sistemas operacionais embarcados utilizando técni...
Troca de contexto segura em sistemas operacionais embarcados utilizando técni...Rodrigo Almeida
 
Python Introdução e Orientação a Objetos.pdf
Python Introdução e Orientação a Objetos.pdfPython Introdução e Orientação a Objetos.pdf
Python Introdução e Orientação a Objetos.pdfMarioAthayde
 
Orientação a Objetos em Python
Orientação a Objetos em PythonOrientação a Objetos em Python
Orientação a Objetos em PythonLuciano Ramalho
 
Aula 02 - Introdução ao PHP
Aula 02 - Introdução ao PHPAula 02 - Introdução ao PHP
Aula 02 - Introdução ao PHPDaniel Brandão
 
Estruturas em C++ (struct)
Estruturas em C++ (struct)Estruturas em C++ (struct)
Estruturas em C++ (struct)Márcio Rizzatto
 

Tendances (20)

Introdução à linguagem UML
Introdução à linguagem UMLIntrodução à linguagem UML
Introdução à linguagem UML
 
Introdução a Linguagem Java
Introdução a Linguagem JavaIntrodução a Linguagem Java
Introdução a Linguagem Java
 
Aula 1 - Introdução a POO
Aula 1 -  Introdução a POOAula 1 -  Introdução a POO
Aula 1 - Introdução a POO
 
Curso de Desenvolvimento Web - Módulo 03 - JavaScript
Curso de Desenvolvimento Web - Módulo 03 - JavaScriptCurso de Desenvolvimento Web - Módulo 03 - JavaScript
Curso de Desenvolvimento Web - Módulo 03 - JavaScript
 
Apostila de Fundamentos Java
Apostila de Fundamentos JavaApostila de Fundamentos Java
Apostila de Fundamentos Java
 
Html Básico
Html BásicoHtml Básico
Html Básico
 
Estrutura de repetição
Estrutura de repetiçãoEstrutura de repetição
Estrutura de repetição
 
Python 02
Python 02Python 02
Python 02
 
Java básico - Módulo 04: Estruturas de controle
Java   básico - Módulo 04:  Estruturas de controleJava   básico - Módulo 04:  Estruturas de controle
Java básico - Módulo 04: Estruturas de controle
 
Aula 04 PHP - Utilizando Funções e Manipulando Arquivos
Aula 04 PHP - Utilizando Funções e Manipulando ArquivosAula 04 PHP - Utilizando Funções e Manipulando Arquivos
Aula 04 PHP - Utilizando Funções e Manipulando Arquivos
 
Aula javascript
Aula  javascriptAula  javascript
Aula javascript
 
Java www
Java wwwJava www
Java www
 
POO - 22 - Tratamento de Exceções em Java
POO - 22 - Tratamento de Exceções em JavaPOO - 22 - Tratamento de Exceções em Java
POO - 22 - Tratamento de Exceções em Java
 
Mock objects - Teste de código com dependências
Mock objects - Teste de código com dependênciasMock objects - Teste de código com dependências
Mock objects - Teste de código com dependências
 
Prototipação de software
Prototipação de softwarePrototipação de software
Prototipação de software
 
Troca de contexto segura em sistemas operacionais embarcados utilizando técni...
Troca de contexto segura em sistemas operacionais embarcados utilizando técni...Troca de contexto segura em sistemas operacionais embarcados utilizando técni...
Troca de contexto segura em sistemas operacionais embarcados utilizando técni...
 
Python Introdução e Orientação a Objetos.pdf
Python Introdução e Orientação a Objetos.pdfPython Introdução e Orientação a Objetos.pdf
Python Introdução e Orientação a Objetos.pdf
 
Orientação a Objetos em Python
Orientação a Objetos em PythonOrientação a Objetos em Python
Orientação a Objetos em Python
 
Aula 02 - Introdução ao PHP
Aula 02 - Introdução ao PHPAula 02 - Introdução ao PHP
Aula 02 - Introdução ao PHP
 
Estruturas em C++ (struct)
Estruturas em C++ (struct)Estruturas em C++ (struct)
Estruturas em C++ (struct)
 

Similaire à Programando em python interfaces graficas com tk

Similaire à Programando em python interfaces graficas com tk (20)

Interface grafica
Interface graficaInterface grafica
Interface grafica
 
CURSO JAVA 02
CURSO JAVA 02CURSO JAVA 02
CURSO JAVA 02
 
Curso matlab 6 especiais
Curso matlab 6 especiaisCurso matlab 6 especiais
Curso matlab 6 especiais
 
GUI Aplicações Gráficas
GUI Aplicações Gráficas GUI Aplicações Gráficas
GUI Aplicações Gráficas
 
Excel Basic com VBA - Macros
Excel Basic com VBA - MacrosExcel Basic com VBA - Macros
Excel Basic com VBA - Macros
 
Jython no JavaOne Latin America 2011
Jython no JavaOne Latin America 2011Jython no JavaOne Latin America 2011
Jython no JavaOne Latin America 2011
 
Apostila:Curso de java II
Apostila:Curso de java II  Apostila:Curso de java II
Apostila:Curso de java II
 
Detalhando elementos do delphi
Detalhando elementos do delphiDetalhando elementos do delphi
Detalhando elementos do delphi
 
Linguagem R
Linguagem RLinguagem R
Linguagem R
 
Aprenda jQuery 1.3
Aprenda jQuery 1.3Aprenda jQuery 1.3
Aprenda jQuery 1.3
 
Aprendendo objective c - parte 1
Aprendendo objective c - parte 1Aprendendo objective c - parte 1
Aprendendo objective c - parte 1
 
Interface Gráfica.ppt
Interface Gráfica.pptInterface Gráfica.ppt
Interface Gráfica.ppt
 
Utilizando o Winplot como recurso ao ensino da matemática
Utilizando o Winplot como recurso ao ensino da matemáticaUtilizando o Winplot como recurso ao ensino da matemática
Utilizando o Winplot como recurso ao ensino da matemática
 
Tutorial matlab
Tutorial matlabTutorial matlab
Tutorial matlab
 
Haskell aula5 f.ordem-sup_modulos-cifra_cesar
Haskell aula5 f.ordem-sup_modulos-cifra_cesarHaskell aula5 f.ordem-sup_modulos-cifra_cesar
Haskell aula5 f.ordem-sup_modulos-cifra_cesar
 
Hiearquia Window
Hiearquia WindowHiearquia Window
Hiearquia Window
 
Java AWT
Java AWTJava AWT
Java AWT
 
Computação Móvel 2012.2 - Android
Computação Móvel 2012.2 - AndroidComputação Móvel 2012.2 - Android
Computação Móvel 2012.2 - Android
 
Aula 01
Aula 01Aula 01
Aula 01
 
Programação Orientada por Objectos - Aula 6
Programação Orientada por Objectos - Aula 6Programação Orientada por Objectos - Aula 6
Programação Orientada por Objectos - Aula 6
 

Plus de samuelthiago

Interface grafica em_java_parte_v
Interface grafica em_java_parte_vInterface grafica em_java_parte_v
Interface grafica em_java_parte_vsamuelthiago
 
Interface grafica em_java_parte_iv
Interface grafica em_java_parte_ivInterface grafica em_java_parte_iv
Interface grafica em_java_parte_ivsamuelthiago
 
Interface grafica em_java_parte_iii
Interface grafica em_java_parte_iiiInterface grafica em_java_parte_iii
Interface grafica em_java_parte_iiisamuelthiago
 
Interface grafica em_java_parte_ii
Interface grafica em_java_parte_iiInterface grafica em_java_parte_ii
Interface grafica em_java_parte_iisamuelthiago
 
Interface grafica em_java_parte_i
Interface grafica em_java_parte_iInterface grafica em_java_parte_i
Interface grafica em_java_parte_isamuelthiago
 
Poo interacao entre_objetos_blue_j_ii
Poo interacao entre_objetos_blue_j_iiPoo interacao entre_objetos_blue_j_ii
Poo interacao entre_objetos_blue_j_iisamuelthiago
 
Introducao a poo_com_blue_j
Introducao a poo_com_blue_jIntroducao a poo_com_blue_j
Introducao a poo_com_blue_jsamuelthiago
 
Projeto calculadora em_java
Projeto calculadora em_javaProjeto calculadora em_java
Projeto calculadora em_javasamuelthiago
 
Introducao a poo_com_blue_j
Introducao a poo_com_blue_jIntroducao a poo_com_blue_j
Introducao a poo_com_blue_jsamuelthiago
 
01 02 introdução aos bancos de dados (slides)
01 02 introdução aos bancos de dados (slides)01 02 introdução aos bancos de dados (slides)
01 02 introdução aos bancos de dados (slides)samuelthiago
 

Plus de samuelthiago (20)

Eclipse i (1)
Eclipse i (1)Eclipse i (1)
Eclipse i (1)
 
Html básico
Html básicoHtml básico
Html básico
 
Interface grafica em_java_parte_v
Interface grafica em_java_parte_vInterface grafica em_java_parte_v
Interface grafica em_java_parte_v
 
Interface grafica em_java_parte_iv
Interface grafica em_java_parte_ivInterface grafica em_java_parte_iv
Interface grafica em_java_parte_iv
 
Interface grafica em_java_parte_iii
Interface grafica em_java_parte_iiiInterface grafica em_java_parte_iii
Interface grafica em_java_parte_iii
 
Interface grafica em_java_parte_ii
Interface grafica em_java_parte_iiInterface grafica em_java_parte_ii
Interface grafica em_java_parte_ii
 
Interface grafica em_java_parte_i
Interface grafica em_java_parte_iInterface grafica em_java_parte_i
Interface grafica em_java_parte_i
 
Poo interacao entre_objetos_blue_j_ii
Poo interacao entre_objetos_blue_j_iiPoo interacao entre_objetos_blue_j_ii
Poo interacao entre_objetos_blue_j_ii
 
Introducao a poo_com_blue_j
Introducao a poo_com_blue_jIntroducao a poo_com_blue_j
Introducao a poo_com_blue_j
 
Projeto calculadora em_java
Projeto calculadora em_javaProjeto calculadora em_java
Projeto calculadora em_java
 
Introducao a poo_com_blue_j
Introducao a poo_com_blue_jIntroducao a poo_com_blue_j
Introducao a poo_com_blue_j
 
01 02 introdução aos bancos de dados (slides)
01 02 introdução aos bancos de dados (slides)01 02 introdução aos bancos de dados (slides)
01 02 introdução aos bancos de dados (slides)
 
Java 08
Java 08Java 08
Java 08
 
Java 07
Java 07Java 07
Java 07
 
Java 06
Java 06Java 06
Java 06
 
Java 05
Java 05Java 05
Java 05
 
Java 04
Java 04Java 04
Java 04
 
Java 03
Java 03Java 03
Java 03
 
Java 02
Java 02Java 02
Java 02
 
Java 01
Java 01Java 01
Java 01
 

Dernier

ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx2m Assessoria
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx2m Assessoria
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsDanilo Pinotti
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx2m Assessoria
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploDanilo Pinotti
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx2m Assessoria
 

Dernier (6)

ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 

Programando em python interfaces graficas com tk

  • 1. Python: Interfaces Gráficas com Tk Claudio Esperança
  • 2. Interfaces Gráficas  Também chamadas de Graphical User Interfaces (GUI)  Usadas em aplicações modernas que requerem uma interação constante com o usuário  Maior usabilidade e naturalidade do que interfaces textuais  Aplicação apresenta uma ou mais janelas com elementos gráficos que servem para comandar ações, especificar parâmetros, desenhar e exibir gráficos, etc  Bibliotecas (toolkits) para construção de interfaces como  Qt  Gtk  wxWindows  Tk
  • 3. Interfaces Gráficas em Python  Python possui camadas de portabilidade (bindings) para várias bibliotecas de construção de interfaces. Ex.:  PyQt (Qt)  PyGtk (Gtk)  wxPython (wxWindows)  Tkinter (Tk)  Multiplataforma (MS-Windows, Unix/Linux, OSX)
  • 4. Tk  Toolkit originalmente criado para utilização com a linguagem script Tcl  Bastante leve, portátil e robusto  Um tanto obsoleto frente a outros toolkits mais modernos como Qt ou Gtk  Camada Tkinter normalmente distribuída com o Python  Inicia um processo Tcl que toma conta dos elementos de interface  Classes e funções do Tkinter se comunicam com o interpretador Tcl para especifcar aspecto e comportamento da interface
  • 5. Usando Tkinter  Importar o módulo Tkinter  from Tkinter import *  Elementos de interface (widgets) correspondem a objetos de diversas classes. Por exemplo:  Frame (Área retangular)  Button (botão)  Label (rótulo)  Text (caixa de texto)  Canvas (caixa de desenho)  Posição e tamanho dos elementos controlados por gerentes de geometria  Pack (mais comum), Place, Grid
  • 6. Usando Tkinter (2)  Para criar um widget, tem-se que informar o widget-pai (parâmetro master) onde geometricamente deverá ser encaixado e as opções de configuração para o widget. Ex.: w = Button(pai,text=”Cancelar”,command=cancelar)  Tk já define por default uma janela principal  master=None (default) indica que o widget será filho da janela principal  Outras janelas pode ser criadas criando objetos da classe Toplevel  A função mainloop tem que ser invocada para que a aplicação entre no modo de tratamento de eventos
  • 7. Exemplo from Tkinter import * class Application(Frame): def __init__(self, master=None): Frame.__init__(self, master) self.msg = Label(self, text="Hello World") self.msg.pack () self.bye = Button (self, text="Bye", command=self.quit) self.bye.pack () self.pack() app = Application() mainloop()
  • 8. Exemplo from Tkinter import * class Application(Frame): def __init__(self, master=None): Frame.__init__(self, master) self.msg = Label(self, text="Hello World") self.msg.pack () self.bye = Button (self, text="Bye", command=self.quit) self.bye.pack () self.pack() app = Application() mainloop()
  • 9. Exemplo from Tkinter import * Elemento principal derivado de Frame class Application(Frame): Construtor da classe base def __init__(self, master=None): Frame.__init__(self, master) self.msg = Label(self, text="Hello World") self.msg.pack () self.bye = Button (self, text="Bye", command=self.quit) self.bye.pack () self.pack() Janela tem um rótulo e um botão Interface é instanciada app = Application() mainloop() Laço de tratamento de eventos é iniciado
  • 10. Classes de componentes  Button Um botão simples usado para executar um comando  Canvas Provê facilidades de gráficos estruturados  Checkbutton Representa uma variável que pode ter dois valores distintos (tipicamente um valor booleano). Clicando no botão alterna-se entre os valores  Entry 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
  • 11. Classes de componentes (cont.)  Menu Um painel de menu. Implementa menus de janela, pulldowns e popups  Message Similar ao widget Label, mas tem mais facilidade para mostrar texto quebrado em linhas  Radiobutton Representa um possível valor de uma variável que tem um de muitos valores. Clicando o botão, a variável assume aquele valor  Scale Permite especificar um valor numérico através de um ponteiro em uma escala linear  Scrollbar Barra de rolamento para widgets que têm superfície útil variável (Text, Canvas, Entry, Listbox)  Text Exibe e permite editar texto formatado. Também suporta imagens e janelas embutidas  Toplevel Uma janela separada
  • 12. A 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 vários métodos, entre os quais  title (string) Especifica o título da janela  geometry(string) Especifica tamanho e posição da janela  String tem a forma larguraxaltura+x+y
  • 13. Exemplo from Tkinter import * class Application(Frame): def __init__(self, master=None): Frame.__init__(self, master) self.msg = Label(self, text="Hello World") self.msg.pack () self.bye = Button (self, text="Bye", command=self.quit) self.bye.pack () self.pack() app = Application() app.master.title("Exemplo") app.master.geometry("200x200+100+100") mainloop()
  • 14. Opções de Widgets  Widgets (elementos de interface) têm opções 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')  Opções são especificadas  No construtor  Através do método configure
  • 15. Exemplo from Tkinter import * top = Frame() ; top.pack() rotulo = Label (top, text="Rótulo Exemplo", foreground="blue") rotulo.pack () rotulo.configure(relief="ridge", font="Arial 24 bold", border=5, background="yellow")
  • 16. O método configure  Usado com pares do tipo opção=valor, modifica os valores dos atributos  Usado com uma string “nomeopção” retorna a configuração da opção com esse nome  A configuração é 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 opção  valor corrente da opção  Se configure é usado sem argumentos, retorna um dicionário com todas as opções  Pode-se obter diretamente o valor de uma opção usando o método cget
  • 17. Exemplo >>> rotulo.configure(relief="ridge") >>> rotulo.configure("relief") ('relief', 'relief', 'Relief', <index object at 0x85f9530>, 'ridge') >>> rotulo.configure()["relief"] ('relief', 'relief', 'Relief', <index object at 0x85f9530>, 'ridge') >>> rotulo.configure("relief")[4] 'ridge' >>> rotulo.cget("relief") 'ridge'
  • 18. Gerenciando geometrias  Todos os elementos de interface ocupam uma área retangular na janela  A posição e tamanho de cada elemento é determinada por um gerenciador de geometria  O elemento não “aparece” enquanto não for informado ao gerenciador  A geometria resultante depende de  Propriedades dos elementos (tamanho mínimo, tamanho da moldura, etc)  Opções do gerenciador  Algoritmo usado pelo gerenciador  O gerenciador mais usado em Tk é o pack
  • 19. Usando o pack  Para informar que um elemento deve ser gerenciado pelo pack, use o método pack (opções)  O pack considera o espaço 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 possíveis são 'top', 'left', 'right' e 'bottom'  Deve-se imaginar que sempre que um elemento filho escolhe um lado, a cavidade disponível fica restrita ao lado oposto
  • 20. Exemplo from Tkinter import * top = Frame() ; top.pack() a = Label (top, text="A") ; a.pack (side="left") b = Label (top, text="B") ; b.pack (side="bottom") 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()
  • 21. Redimensionamento  Por default, o pack não redimensiona os filhos quando o pai é redimensionado  Duas opções controlam o redimensionamento dos filhos  expand (booleano)  Se verdadeiro, indica que o filho deve tomar toda a cavidade disponível no pai  Caso contrário, toma apenas o espaço necessário (default)  fill ('none', 'x', 'y' ou 'both')  Indica como o desenho do elemento irá preencher o espaço alocado  'x' / 'y' indica que irá preencher a largura / altura  'both' indica preenchimento de todo o espaço  'none' indica que apenas o espaço necessário será ocupado (default)
  • 22. Exemplo from Tkinter import * top = Frame() ; top.pack() 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()
  • 23. Exemplo from Tkinter import * top = Frame() ; top.pack() 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()
  • 24. Exemplo 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()
  • 25. Exemplo 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()
  • 26. Exemplo 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()
  • 27. Exemplo 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()
  • 28. Usando frames  Frames podem ser usados para auxiliar no layout dos elementos com pack. Ex.: 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()
  • 29. Usando frames  Frames podem ser usados para auxiliar no layout dos elementos com pack. Ex.: 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()
  • 30. Programação com eventos  Diferente da programação convencional  O programa não está sob controle 100% do tempo  Programa entrega controle ao sistema  Em Tk: método(função) mainloop  Interação gera eventos. Ex:  Acionamento de um menu ou de um botão  Mouse arrastado sobre uma janela  Uma caixa de texto teve seu valor alterado  O tratamento de um evento é feito por uma rotina “Callback”
  • 31. A opção command  Muitos componentes do Tk suportam a opção command que indica uma função a ser invocada sempre que o widget é acionado  Tipicamente, a função (ou método) usado obtém valores de outros widgets para realizar alguma operação
  • 32. Exemplo 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() r = Label(text="0") r.pack() mainloop()
  • 33. Exemplo 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() r = Label(text="0") r.pack() mainloop()
  • 34. Exemplo 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() r = Label(text="0") r.pack() mainloop()
  • 35. Eventos e Bind  Widgets que não dispõem da opção command também podem receber eventos e responder a eles  O método bind permite especificar um padrão de eventos ao qual o widget será sensível e uma rotina callback para tratá-lo bind(padrão,rotina)  padrão é uma string que descreve quais eventos a rotina irá tratar  rotina é uma função ou método com exatamente um parâmetro: o evento que deve ser tratado
  • 36. Exemplo from Tkinter import * def clica (e): txt = "Mouse clicado emn%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()
  • 37. Exemplo from Tkinter import * def clica (e): txt = "Mouse clicado emn%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()
  • 38. Exemplo from Tkinter import * def clica (e): txt = "Mouse clicado emn%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()
  • 39. Campos do objeto evento  x,y : posição do mouse com relação ao canto superior esquerdo do widget  x_root, y_root: posição do mouse com relação ao canto superior esquerdo da tela  char: caractere digitado (eventos de teclado)  keysym: representação simbólica da tecla  keycode: representação numérica da tecla  num: número do botão – 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)
  • 40. Padrões de evento (mouse)  <Button-i> para i = 1,2,3: botão i do mouse pressionado sobre o widget  <Motion> : mouse arrastado sobre o widget  <Bi-Motion> : mouse arrastado sobre o widget com o botão i pressionado  <ButtonRelease-i> : botão i do mouse solto sobre o widget  <Double-Button-i>: botão i do mouse clicado duas vezes em seguida  <Enter>: O mouse entrou na área do widget  <Leave>: O mouse saiu da área do widget
  • 41. Padrões 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 forçado usando o método focus
  • 42. Exemplo from Tkinter import * def clica (e): txt = "Mouse clicado emn%d,%d"%(e.x,e.y) r.configure(text=txt) r.focus() def tecla(e): txt="Keysym=%snKeycode=%snChar=%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)
  • 43. Exemplo from Tkinter import * def clica (e): txt = "Mouse clicado emn%d,%d"%(e.x,e.y) r.configure(text=txt) r.focus() def tecla(e): txt="Keysym=%snKeycode=%snChar=%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)
  • 44. Exemplo from Tkinter import * def clica (e): txt = "Mouse clicado emn%d,%d"%(e.x,e.y) r.configure(text=txt) r.focus() def tecla(e): txt="Keysym=%snKeycode=%snChar=%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)
  • 45. Exemplo from Tkinter import * def clica (e): txt = "Mouse clicado emn%d,%d"%(e.x,e.y) r.configure(text=txt) r.focus() def tecla(e): txt="Keysym=%snKeycode=%snChar=%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)
  • 46. Exemplo from Tkinter import * def clica (e): txt = "Mouse clicado emn%d,%d"%(e.x,e.y) r.configure(text=txt) r.focus() def tecla(e): txt="Keysym=%snKeycode=%snChar=%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)
  • 47. Menus  Podem ser associados a uma janela (menus toplevel), pulldown, popup e em cascata a partir de outro menu  Todos são instâncias 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 vários estados mutuamente exclusivos  cascade ativa um outro menu em cascata  Para adicionar um item a um menu, use métodos da forma add (“tipo”, opções) ou add_tipo(opções)
  • 48. 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, não necessita ter sua geometria gerenciada (e.g., pack ou grid)  Para associar a uma janela, usa-se a opção menu do objeto janela.
  • 49. Exemplo from Tkinter import * def abrir(): print "abrir" def salvar(): print "salvar" def ajuda() : print "ajuda" top=Tk() principal=Menu(top) 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) top.configure(menu=principal)
  • 50. Exemplo from Tkinter import * def abrir(): print "abrir" def salvar(): print "salvar" def ajuda() : print "ajuda" top=Tk() principal=Menu(top) 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) top.configure(menu=principal)
  • 51. Exemplo from Tkinter import * def abrir(): print "abrir" def salvar(): print "salvar" def ajuda() : print "ajuda" top=Tk() principal=Menu(top) 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) top.configure(menu=principal)
  • 52. Menus Popup  Um menu popup é aquele que é exibido numa janela independente  Para que o menu seja exibido, é preciso invocar o método post: post (x, y)  onde x e y são as coordenadas do canto superior esquerdo do menu com relação ao canto superior esquerdo da tela
  • 53. Exemplo 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()
  • 54. Exemplo 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()
  • 55. Variáveis  Tk é controlado por um interpretador Tcl (e não diretamente pelo python)  Em alguns casos, deseja-se usar usar variáveis na interface  Por exemplo, é possível especificar que o texto exibido em um Label é o valor de uma variável (e não uma constante)  Nesse caso, usa-se a opção textvar ao inves de text  Variáveis Tcl são expostas à aplicaçãoPython através das classes StringVar, IntVar e DoubleVar  O construtor é da forma StringVar(master) onde master é uma janela ou widget  Instâncias dessas classes possuem os métodos get e set que podem ser usados para acessar os valores armazenados no interpretador Tcl
  • 56. Exemplo 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()
  • 57. Exemplo 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()
  • 58. Exemplo 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()
  • 59. Exemplo 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()
  • 60. Checkbuttons  Checkbutton Representa uma variável que pode ter dois valores distintos (tipicamente um valor booleano). Clicando no botão alterna-se entre os valores  A callback especificada pela opção command é chamada sempre que a variável muda de valor  Estado é armazenado pela variável Tcl especificada pela opção variable  Se a variável é inteira, o valor correspondente ao checkbutton “desligado”/“ligado” é 0/1  É possível usar um checkbutton com uma variável string  Nesse caso, os valores correspondentes a “desligado”/“ligado” são especificados com as opções offvalue e onvalue
  • 61. 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()
  • 62. 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()
  • 63. 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()
  • 64. 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()
  • 65. Radiobuttons  Radiobutton representa um possível valor de uma variável que tem um de muitos valores. Clicando o botão, a variável assume aquele valor  A variável é especificada com a opção variable e o valor associado com a opção value  Os radiobuttons que se referem à mesma variável 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 botão normal
  • 66. 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()
  • 67. 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()
  • 68. 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()
  • 69. 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()
  • 70. 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,indicatoron=False).pack(fill='x') mainloop()
  • 71. 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,indicatoron=False).pack(fill='x') mainloop()
  • 72. Entry  Um Entry permite entrada/edição de uma linha de texto  O texto associado ao Entry é normalmente armazenado numa variável indicada pela opção textvariable  Se não indicada, é usada uma variável interna cujo valor pode ser obtido usando o método get()  Há diversos métodos para manipular diretamente o texto  Usam o conceito de índices (não confundir com os índices usado pelo Python)  Por exemplo, o índice INSERT indica a posição do texto onde o cursor de inserção se encontra, 0 a posição antes do primeiro caractere e END a posição ao final do texto
  • 73. 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()
  • 74. 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()
  • 75. 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()
  • 76. 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()
  • 77. Canvas  Permite a exibição e edição de gráficos estruturados 2D  Elementos gráficos (itens) são introduzidos usando métodos da forma create_tipo (...), onde tipo pode ser  arc arco de círculo  bitmap imagem binária  image imagem colorida  line linha poligonal  oval círculos e elipses  polygon polígonos  rectangle retângulo  text texto  window um widget tk
  • 78. Exemplo 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="python.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="TextonTexto", font="Arial 22")
  • 79. Exemplo 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="python.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="TextonTexto", font="Arial 22")
  • 80. Coordenadas de Itens  Todos os métodos create_item têm 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 extensão (caixa envolvente)  Os itens line e polygon podem ser seguidos por outros pares de coordenadas que especificam demais vértices  As coordenadas referem-se a um sistema de coordenadas próprio que pode ser diferente do da janela  A área do canvas que deve ser mostrada na janela pode ser modificada pela opção scrollarea=(xmin,ymin,xmax,ymax)  Para obter as coordenadas do canvas dadas as coordenadas da janela usa-se os métodos canvasx(x) e canvasy(y)
  • 81. Identificação de Itens  Todo item de um canvas tem um identificador numérico que é retornado pelo método create_item  Pode-se também associar tags (etiquetas) a itens  Usa-se a opção tags=tags onde tags pode ser uma string ou uma tupla com várias 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
  • 82. Métodos de Canvas  itemconfig (itemOuTag, ...) altera opções do(s) item(s)  tag_bind(itemOuTag, padrão, callback) associa uma callback a um padrão 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  itemcget(item,opção) retorna o valor da opção dada do item
  • 83. Exemplo from Tkinter import * c = Canvas() c.pack() def novalinha(e): x,y = c.canvasx(e.x), c.canvasy(e.y) c.create_line(x,y,x,y,tags="corrente") def estendelinha(e): x,y = c.canvasx(e.x), c.canvasy(e.y) coords = c.coords("corrente") + [x,y] c.coords("corrente",*coords) def fechalinha(e): c.itemconfig("corrente",tags=()) c.bind("<Button-1>", novalinha) c.bind("<B1-Motion>", estendelinha) c.bind("<ButtonRelease-1>", fechalinha) c.pack()
  • 84. Exemplo from Tkinter import * c = Canvas() c.pack() def novalinha(e): x,y = c.canvasx(e.x), c.canvasy(e.y) c.create_line(x,y,x,y,tags="corrente") def estendelinha(e): x,y = c.canvasx(e.x), c.canvasy(e.y) coords = c.coords("corrente") + [x,y] c.coords("corrente",*coords) def fechalinha(e): c.itemconfig("corrente",tags=()) c.bind("<Button-1>", novalinha) c.bind("<B1-Motion>", estendelinha) c.bind("<ButtonRelease-1>", fechalinha) c.pack()
  • 85. Exemplo from Tkinter import * c = Canvas() c.pack() def novalinha(e): x,y = c.canvasx(e.x), c.canvasy(e.y) c.create_line(x,y,x,y,tags="corrente") def estendelinha(e): x,y = c.canvasx(e.x), c.canvasy(e.y) coords = c.coords("corrente") + [x,y] c.coords("corrente",*coords) def fechalinha(e): c.itemconfig("corrente",tags=()) c.bind("<Button-1>", novalinha) c.bind("<B1-Motion>", estendelinha) c.bind("<ButtonRelease-1>", fechalinha) c.pack()
  • 86. Exemplo from Tkinter import * c = Canvas() c.pack() def novalinha(e): x,y = c.canvasx(e.x), c.canvasy(e.y) c.create_line(x,y,x,y,tags="corrente") def estendelinha(e): x,y = c.canvasx(e.x), c.canvasy(e.y) coords = c.coords("corrente") + [x,y] c.coords("corrente",*coords) def fechalinha(e): c.itemconfig("corrente",tags=()) c.bind("<Button-1>", novalinha) c.bind("<B1-Motion>", estendelinha) c.bind("<ButtonRelease-1>", fechalinha) c.pack()
  • 87. Exemplo ... def selecionalinha(e): global x0,y0 x0,y0 = c.canvasx(e.x), c.canvasy(e.y) c.itemconfig(CURRENT, tags="sel") def movelinha (e): global x0,y0 x1,y1 = c.canvasx(e.x), c.canvasy(e.y) c.move("sel",x1-x0,y1-y0) x0,y0=x1,y1 def deselecionalinha(e): c.itemconfig("sel", tags=()) c.bind("<Button-3>", selecionalinha) c.bind("<B3-Motion>", movelinha) c.bind("<ButtonRelease-3>", deselecionalinha)
  • 88. Exemplo ... def selecionalinha(e): global x0,y0 x0,y0 = c.canvasx(e.x), c.canvasy(e.y) c.itemconfig(CURRENT, tags="sel") def movelinha (e): global x0,y0 x1,y1 = c.canvasx(e.x), c.canvasy(e.y) c.move("sel",x1-x0,y1-y0) x0,y0=x1,y1 def deselecionalinha(e): c.itemconfig("sel", tags=()) c.bind("<Button-3>", selecionalinha) c.bind("<B3-Motion>", movelinha) c.bind("<ButtonRelease-3>", deselecionalinha)
  • 89. Exemplo ... def selecionalinha(e): global x0,y0 x0,y0 = c.canvasx(e.x), c.canvasy(e.y) c.itemconfig(CURRENT, tags="sel") def movelinha (e): global x0,y0 x1,y1 = c.canvasx(e.x), c.canvasy(e.y) c.move("sel",x1-x0,y1-y0) x0,y0=x1,y1 def deselecionalinha(e): c.itemconfig("sel", tags=()) c.bind("<Button-3>", selecionalinha) c.bind("<B3-Motion>", movelinha) c.bind("<ButtonRelease-3>", deselecionalinha)
  • 90. Scrollbar  Barras de rolamento são usadas com outros widgets com área útil maior do que pode ser exibida na janela (Canvas, Text, Listbox, Entry)  Uma barra de rolamento horizontal (vertical) funciona chamando o método xview (yview) do widget associado  Isto é feito configurando a opção command da barra  Por outro lado, sempre que a visão do widget muda, a barra de rolamento precisa ser atualizada  Isto é feito configurando a opção xscrollcommand (ou yscrollcommand) do widget ao método set da barra
  • 91. 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)
  • 92. 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)