python_para_desenvolvedores
253 pág.

python_para_desenvolvedores


DisciplinaComputação II158 materiais479 seguidores
Pré-visualização34 páginas
# Gera a página principal a partir do modelo "index.html"
 return cherrytemplate.renderTemplate(file='index.html',
 outputEncoding='utf-8')
 @cherrypy.expose
 def add(self):
 """
 Cadastra novos registros
 """
 # Gera a página de registro novo a partir do modelo "add.html"
 return cherrytemplate.renderTemplate(file='add.html',
 outputEncoding='utf-8')
 @cherrypy.expose
 def rem(self, ident):
 """
 Confirma a remoção de registros
 """
164 MVC
 # Seleciona o registro
 sel = zoo.select(zoo.c.id==ident)
 rec = sel.execute()
 res = rec.fetchone()
 # Gera a página de confirmar exclusão a partir do modelo "rem.html"
 return cherrytemplate.renderTemplate(file='rem.html',
 outputEncoding='utf-8')
 @cherrypy.expose
 def mod(self, ident):
 """
 Modifica registros
 """
 # Seleciona o registro
 sel = zoo.select(zoo.c.id==ident)
 rec = sel.execute()
 res = rec.fetchone()
 # Gera a página de alteração de registro a partir do modelo "mod.html"
 return cherrytemplate.renderTemplate(file='mod.html',
 outputEncoding='utf-8')
# Inicia o servidor na porta 8080
cherrypy.quickstart(Root())
Modelo \u201cindex.html\u201d (página principal):
<py-include=&quot;header.html&quot;>
<table>
<tr>
<th></th>
<py-for=&quot;coluna in colunas&quot;>
 <th><py-eval=&quot;coluna&quot;></th>
</py-for>
<th></th>
<th></th>
</tr>
<py-for=&quot;i, campos in enumerate(rec.fetchall())&quot;>
 <tr>
 <th><py-eval=&quot;unicode(i + 1)&quot;></th>
 <py-for=&quot;coluna in colunas&quot;>
 <td><py-eval=&quot;unicode(campos[coluna])&quot;></td>
 </py-for>
 <td>
 <a href=&quot;/mod?ident=<py-eval=&quot;unicode(campos['id'])&quot;>&quot;>modificar</a>
 </td><td>
 <a href=&quot;/rem?ident=<py-eval=&quot;unicode(campos['id'])&quot;>&quot;>remover</a>
 </td>
 </tr>
</py-for>
MVC 165
</table>
<br />
<form action=&quot;/add&quot; method=&quot;post&quot;>
 <input type=&quot;submit&quot; value=&quot; adicionar &quot; />
</form>
<p>
<py-eval=&quot;msg&quot;>
</p>
<py-include=&quot;footer.html&quot;>
Modelo \u201cadd.html\u201d (página de formulário para novos registros):
<py-include=&quot;header.html&quot;>
<form action=&quot;/?op=add&quot; method=&quot;post&quot;>
 <table>
 <py-for=&quot;coluna in colunas&quot;>
 <tr><td>
 <py-eval=&quot;coluna&quot;>
 </td><td>
 <input type=&quot;text&quot; size=&quot;30&quot; name=&quot;<py-eval=&quot;coluna&quot;>&quot; />
 </td></tr>
 </py-for>
 </table>
<br />
<input type=&quot;submit&quot; value=&quot; salvar &quot; />
</form>
<br />
[ <a href=&quot;/&quot;>voltar</a> ]
<py-include=&quot;footer.html&quot;>
Modelo \u201cmod.html\u201d (página de formulário para alteração de registros):
<py-include=&quot;header.html&quot;>
<form action=&quot;/?op=mod&ident=<py-eval=&quot;unicode(res['id'])&quot;>&quot; method=&quot;post&quot;>
 <table border=&quot;0&quot;>
 <py-for=&quot;coluna in colunas&quot;>
 <tr><th>
 <py-eval=&quot;coluna&quot;>
 </th><td>
 <input type=&quot;text&quot; size=&quot;30&quot; name=&quot;<py-eval=&quot;coluna&quot;>&quot;
 value=&quot;<py-eval=&quot;unicode(res[coluna])&quot;>&quot; />
 </td></tr>
 </py-for>
 </table>
<br />
<input type=&quot;submit&quot; value=&quot; salvar &quot; />
</form>
<br />
[ <a href=&quot;/&quot;>voltar</a> ]
166 MVC
<py-include=&quot;footer.html&quot;>
Modelo \u201crem.html\u201d (página que pede confirmação para remoção de registros):
<py-include=&quot;header.html&quot;>
<table border=&quot;1&quot;>
<tr>
<py-for=&quot;coluna in colunas&quot;>
 <th><py-eval=&quot;coluna&quot;></th>
</py-for>
</tr>
<tr>
<py-for=&quot;coluna in colunas&quot;>
 <td><py-eval=&quot;unicode(res[coluna])&quot;></td>
</py-for>
</tr>
</table>
<br />
<form action=&quot;/?op=rem&ident=<py-eval=&quot;unicode(res['id'])&quot;>&quot; method=&quot;post&quot;>
 <input type=&quot;submit&quot; value=&quot; remover &quot; />
</form>
<br />
[ <a href=&quot;/&quot;>voltar</a> ]
<py-include=&quot;footer.html&quot;>
Modelo \u201cheader.html\u201d (cabeçalho comum a todos os modelos):
<html>
<head>
 <meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html;charset=utf-8&quot; />
<title>Zoo</title>
<style type=&quot;text/css&quot;>
<!--
body {
 margin: 10;
 padding: 10;
 font: 80% Verdana, Lucida, sans-serif;
 color: #333366;
}
h1 {
 margin: 0;
 padding: 0;
 font: 200% Lucida, Verdana, sans-serif;
}
a {
 color: #436976;
 text-decoration: none;
}
MVC 167
a:hover {
 background: #c4cded;
 text-decoration: underline;
}
table {
 margin: 1em 0em 1em 0em;
 border-collapse: collapse;
 border-left: 1px solid #858ba1;
 border-bottom: 1px solid #858ba1;
 font: 90% Verdana, Lucida, sans-serif;
}
table th {
 padding: 0em 1em 0em 1em;
 border-top: 1px solid #858ba1;
 border-bottom: 1px solid #858ba1;
 border-right: 1px solid #858ba1;
 background: #c4cded;
 font-weight: normal;
}
table td {
 padding: 0em 1em 0em 1em;
 border-top: 1px solid #858ba1;
 border-right: 1px solid #858ba1;
 text-align: center;
}
form {
 margin: 0;
 border: none;
}
input {
 border: 1px solid #858ba1;
 background-color: #c4cded;
 vertical-align: middle;
}
-->
</style>
</head>
<body>
<h1>Zoo</h1>
<br />
Modelo \u201cfooter.html\u201d (rodapé comum a todos os modelos):
</body>
</html>
Página principal:
168 MVC
Exercícios V 169
Exercícios V
1. Implementar uma classe Animal com os atributos: nome, espécie, gênero, peso, altura e 
idade. O objeto derivado desta classe deverá salvar seu estado em arquivo com um 
método chamado \u201csalvar\u201d e recarregar o estado em um método chamado \u201cdesfazer\u201d.
2. Implementar uma função que formate uma lista de tuplas como tabela HTML.
3. Implementar uma aplicação Web com uma saudação dependente do horário (exemplos: 
\u201cBom dia, são 09:00.\u201d, \u201cBoa tarde, são 13:00.\u201d e \u201cBoa noite, são 23:00.\u201d).
4. Implementar uma aplicação Web com um formulário que receba expressões Python e 
retorne a expressão com seu resultado.
170 Parte VI
Parte VI
\u25aa Interface gráfica.
\u25aa Threads.
\u25aa Processamento distribuído.
\u25aa Performance.
\u25aa Exercícios VI.
Interface Gráfica 171
Interface Gráfica
As Interfaces Gráficas com Usuário (GUI, Graphic User Interface) se popularizaram no 
ambiente desktop, devido à facilidade de uso e a produtividade. Existem hoje muitas 
bibliotecas disponíveis para a construção de aplicações GUI, tais como: GTK+, QT, TK e 
wxWidgets.
O GTK+52 (GIMP Toolkit) é uma biblioteca Open Source escrita em linguagem C. 
Originalmente concebida para ser usada pelo GIMP53, é compatível com as plataformas 
mais utilizadas atualmente e rica em recursos, entre eles, um construtor de interfaces 
chamado Glade.
Interface do Glade:
O GTK+ é usado pelo GNOME54 (ambiente desktop Open Source) e por diversas aplicativos, 
como os portes do Mozilla Firefox e do BrOffice.org para sistemas UNIX. O GTK+ pode ser 
52 A página internet do projeto reside em: http://www.gtk.org/. e os binários para Windows estão 
disponíveis em: http://gladewin32.sourceforge.net/. A versão para desenvolvedores instala o Glade.
53 Endereço oficial do projeto: http://www.gimp.org/.
54 Documentação e fontes em: http://www.gnome.org/.
172 Interface Gráfica
usado no Python através do pacote PyGTK55. Os portes das bibliotecas para Windows 
podem ser encontrados em:
\u25aa PyGTK: http://ftp.gnome.org/pub/gnome/binaries/win32/pygtk/
\u25aa PyGObject: http://ftp.gnome.org/pub/gnome/binaries/win32/pygobject/
\u25aa PyCairo: http://ftp.gnome.org/pub/gnome/binaries/win32/pycairo/
Arquitetura
Interfaces gráficas geralmente utilizam a metáfora do desktop, um espaço em duas 
dimensões, é que ocupado por janelas retangulares, que representam aplicativos, 
propriedades ou documentos.
As janelas podem conter diversos tipos de controles (objetos utilizados para interagir com 
o usuário ou para apresentar informações) e containers (objetos que servem de repositório 
para coleções de outros objetos).
A interface gráfica deve ficar esperando