associação pythonbrasil[11] django zope/plone planet Início Logado como (Entrar)

Revisão 2e 2004-02-08 15:27:33

Excluir mensagem

TkinterShelve

Receita: Tkinter e Shelve

Um pequeno exemplo de cadastro (agenda) utilizando Tkinter para a interface GUI e Shelve para a persistência dos objetos. É um software de exemplo e pode (deve) sofrer melhorias. Além disso, é uma boa prática de programação OO separar os objetos de interface dos objetos de negócio. Eu não fiz isso neste exemplo.

Este exemplo apareceu na lista python-brasil@yahoogroups.com.br.

Código

   1 #!/usr/bin/env python
   2 # -*- coding: ISO-8859-1 -*-
   3 # agenda.py
   4                                                                                                     
   5 from Tkinter import *
   6 from Dialog import Dialog
   7 import shelve
   8 
   9 class MainFrame(Frame):
  10     def __init__(self, parent=None):
  11         Frame.__init__(self, parent)
  12         self.grid()
  13         self.createWidgets()
  14         self.master.title("Cadastro de amigos")
  15                                                                                                     
  16     def createWidgets(self):
  17         self.makeScreen()
  18         self.makeToolBar()
  19                                                                                                     
  20     def makeScreen(self):
  21         self.nome = StringVar()
  22         self.endereco = StringVar()
  23         self.telefone = StringVar()
  24 
  25         Label(self, text="Nome:").grid(row=1, sticky=W)
  26         Label(self, text="Endereço:").grid(row=2, sticky=W)
  27         Label(self, text="Telefone:").grid(row=3, sticky=W)
  28 
  29         Entry(self, textvariable=self.nome).grid(row=1, column=1, sticky=W+E)
  30         Entry(self, textvariable=self.endereco).grid(row=2, column=1, sticky=W+E)
  31         Entry(self, textvariable=self.telefone).grid(row=3, column=1, sticky=W+E)
  32 
  33     def makeToolBar(self):
  34         toolbar = Frame(self)
  35         toolbar.grid(row=4, columnspan=2)
  36 
  37         Button(toolbar, text="Adicionar", command=self.adicionar).grid(row=0,column=0)
  38         Button(toolbar, text="Gravar", command=self.gravar).grid(row=0,column=1)
  39         Button(toolbar, text="Remover", command=self.remover).grid(row=0,column=2)
  40         Button(toolbar, text="Procurar", command=self.procurar).grid(row=0,column=3)
  41         Button(toolbar, text="Listar", command=self.listar).grid(row=0,column=4)
  42         Button(toolbar, text="Sair", command=self.sair).grid(row=0,column=5)
  43 
  44     def adicionar(self):
  45         nome = self.nome.get()
  46         if not len(nome):
  47             Dialog(self, title="Erro!", text="Nome inválido", bitmap='error', default=0, strings=('OK',))
  48             return
  49 
  50         if self.db.has_key(nome):
  51             Dialog(self, title="Erro!", text="Nome já cadastrado", bitmap='error', default=0, strings=('OK',))
  52             return
  53 
  54         self.db[nome] = (self.endereco.get(), self.telefone.get())
  55         self.limpaCampos()
  56 
  57     def gravar(self):
  58         nome = self.nome.get()
  59         if not len(nome):
  60             Dialog(self, title="Erro!", text="Nome inválido", bitmap='error', default=0, strings=('OK',))
  61             return
  62 
  63         if not self.db.has_key(nome):
  64             Dialog(self, title="Erro!", text="Nome inexistente, use o botão adicionar", bitmap='error', default=0, strings=('OK',))
  65             return
  66 
  67         self.db[nome] = (self.endereco.get(), self.telefone.get())
  68         self.limpaCampos()
  69 
  70     def limpaCampos(self):
  71         self.nome.set("")
  72         self.telefone.set("")
  73         self.endereco.set("")
  74                                                                                                     
  75     def procurar(self):
  76         nome = self.nome.get()
  77         if not len(nome):
  78             Dialog(self, title="Erro!", text="Nome inválido", bitmap='error', default=0, strings=('OK',))
  79             return
  80 
  81         if not self.db.has_key(nome):
  82             Dialog(self, title="Erro!", text="Nome não encontrado", bitmap='error', default=0, strings=('OK',))
  83             return
  84 
  85         self.telefone.set(self.db.get(nome, "")[0])
  86         self.endereco.set(self.db.get(nome, "")[1])
  87 
  88     def remover(self):
  89         nome = self.nome.get()
  90         if not len(nome):
  91             Dialog(self, title="Erro!", text="Nome inválido", bitmap='error', default=0, strings=('OK',))
  92             return
  93 
  94         if not self.db.has_key(nome):
  95             Dialog(self, title="Erro!", text="Nome não encontrado", bitmap='error', default=0, strings=('OK',))
  96             return
  97 
  98         self.telefone.set(self.db.get(nome, "")[0])
  99         self.endereco.set(self.db.get(nome, "")[1])
 100 
 101         resposta = Dialog(self, title="Confirmação", text="Deseja remover?",
 102                         bitmap='question', default=1, strings=('Sim', 'Não'))
 103         if resposta.num == 0:
 104             del self.db[nome]
 105             self.limpaCampos()
 106 
 107     def listar(self):
 108         print "%-30s | %-20s | %-10s" % ("Nome", "Endereço", "Telefone")
 109         print "%-30s-+-%-20s-+-%-10s" % ("-" * 30, "-" * 20, "-" * 10)
 110         for k in self.db.keys():
 111             print "%-30s | %-20s | %-10s" % (k, self.db[k][0], self.db[k][1])
 112         print
 113 
 114     def sair(self):
 115         resposta = Dialog(self, title="Confirmação", text="Tem certeza que deseja sair?",
 116                         bitmap='question', default=1, strings=('Sim', 'Não'))
 117         if resposta.num == 0: self.quit()
 118 
 119     def setDB(self, db):
 120         self.db = db
 121 
 122 def main():
 123     db = shelve.open("teste.db")
 124     frm = MainFrame()
 125     frm.setDB(db)
 126     frm.mainloop()
 127     print "saindo..."
 128     db.close()
 129 
 130 if __name__ == '__main__':
 131     main()

Usando

$ python agenda.py

ou

$ chmod +x agenda.py
$ ./agenda.py

Volta para CookBook.


OsvaldoSantanaNeto