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.