Por fim vamos ver como listar os registros no banco e exibí-los numa lista. No geral não tem nada de diferente dos arquivos que já vimos, a não ser o detalhe do componete GtkTreeView, que funciona tanto como treeview quanto como listview, que é como o usaremos. Vamos ver o arquivo inteiro, depois comentá-lo.
Arquivo: usuarioslista.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
#Importação das bibliotecas
import pygtk
pygtk.require('2.0')
import gtk
from gtk import glade
import gobject
from sqlite3 import *
#Importação de arquivos do projeto
import funcoes as f
import usuarioscadastro
class UsuariosLista(gtk.Window):
#Método construtor
def __init__(self, widget):
#Inicializar
super(UsuariosLista, self).__init__()
#Carrega arquivo glade
GLADE_FILE = f.CaminhoGlade + 'usuarioslista.glade'
gui = glade.XML(GLADE_FILE, 'winUsuariosLista')
#Associa controles
self.win = gui.get_widget('winUsuariosLista')
self.btnSair = gui.get_widget('btnSair')
self.lstUsuarios = gui.get_widget('lstUsers')
self.btnAlterar = gui.get_widget('btnAlterar')
self.btnExcluir = gui.get_widget('btnExcluir')
#Abre Janela
self.win.show_all()
#Formata controle lista
self.modLista = gtk.TreeStore(gobject.TYPE_INT,
gobject.TYPE_STRING,
gobject.TYPE_STRING)
self.lstUsuarios.set_model(self.modLista)
self.lstUsuarios.set_headers_visible(True)
#Cria colunas da lista
self.CriarColuna('ID', 0)
self.CriarColuna('Usuário', 1)
self.CriarColuna('Nome completo', 2)
#Adiciona scroll à TreeView
self.lstUsuarios.set_rules_hint(True)
#Carrega usuários
self.ListaUsers()
#Estado inicial
self.btnAlterar.set_sensitive(False)
self.btnExcluir.set_sensitive(False)
self.win.set_focus(self.btnSair)
#Eventos dos controles
self.btnSair.connect('clicked', lambda *a: self.Fechar())
self.btnAlterar.connect('clicked', lambda *a: self.AlterarUsuario(widget))
self.lstUsuarios.connect('cursor_changed', lambda *a: self.AtivaBotoes(True))
self.lstUsuarios.connect('row_activated', lambda *a: self.AlterarUsuario(widget))
self.btnExcluir.connect('clicked', lambda *a: self.Excluir())
#Excluir
def Excluir(self):
campo, item = self.lstUsuarios.get_selection().get_selected()
if (item != None):
myNomeExc = campo.get_value(item, 1)
if f.MsgConfirmacao(self.win, "Deseja realmente excluir " + myNomeExc + "?"):
myID = campo.get_value(item, 0)
if myID != f.usuariologadoid:
f.Mensagem(self.win, "Você só pode excluir seu próprio usuário.")
else:
f.query.execute("DELETE FROM usuarios WHERE id = " + str(myID))
f.cnx.commit()
#Lista os usuarios
self.ListaUsers()
else:
f.Mensagem(self.win, "Nenhum ítem foi selecionado.")
#Ativa botoes
def AtivaBotoes(self, Ativo):
self.btnAlterar.set_sensitive(Ativo)
self.btnExcluir.set_sensitive(Ativo)
#Fecha janela
def Fechar(self):
self.win.destroy() == True
#Alterar usuario
def AlterarUsuario(self, widget):
campo, item = self.lstUsuarios.get_selection().get_selected()
if (item != None):
myID = campo.get_value(item, 0)
if myID != f.usuariologadoid:
f.Mensagem(self.win, "Você só pode alterar seu próprio usuário.")
else:
myNome = campo.get_value(item, 1)
usuarioscadastro.UsuariosCadastro(widget, False, myID, self.win, self)
self.win.set_focus(self.lstUsuarios)
else:
f.Mensagem(self.win, "Nenhum ítem foi selecionado.")
#Cria coluna da lista
def CriarColuna(self, titulo, id):
renderer = gtk.CellRendererText()
column = gtk.TreeViewColumn(titulo, renderer, text = id)
column.set_resizable(False)
self.lstUsuarios.append_column(column)
#Lista usuários
def ListaUsers(self):
self.modLista.clear()
#Executa query
f.query.execute('SELECT id, user, nome FROM usuarios ORDER BY user DESC')
#Preenche a lista
for row in f.query:
myiter = self.modLista.insert_after(None, None)
self.modLista.set_value(myiter, 0, row[0])
self.modLista.set_value(myiter, 1, row[1])
self.modLista.set_value(myiter, 2, row[2])
Então primeiro vamos comentar a criação da nossa lista. O componente foi adicionado no arquivo ".glade" vazio, as colunas e a formatação das mesmas são criadas via programação no bloco:
#Formata controle lista
self.modLista = gtk.TreeStore(gobject.TYPE_INT,
gobject.TYPE_STRING,
gobject.TYPE_STRING)
self.lstUsuarios.set_model(self.modLista)
self.lstUsuarios.set_headers_visible(True)
#Cria colunas da lista
self.CriarColuna('ID', 0)
self.CriarColuna('Usuário', 1)
self.CriarColuna('Nome completo', 2)
#Mostra barras de rolagem na lista
self.lstUsuarios.set_rules_hint(True)
Note que temos aí uma função CriarColuna, que foi criado pra não repetirmos código, já que a criação de cada coluna usa os mesmos comandos praticamente. Esta função é declarada mais abaixo no arquivo:
#Cria coluna da lista
def CriarColuna(self, titulo, id):
renderer = gtk.CellRendererText()
column = gtk.TreeViewColumn(titulo, renderer, text = id)
column.set_resizable(False)
self.lstUsuarios.append_column(column)
Por fim temos a função ListaUsers, onde fazemos um loop com os resultados da query no banco e inserimos linha por linha:
#Lista usuários
def ListaUsers(self):
self.modLista.clear()
#Executa query
f.query.execute('SELECT id, user, nome FROM usuarios ORDER BY user DESC')
#Preenche a lista
for row in f.query:
myiter = self.modLista.insert_after(None, None)
self.modLista.set_value(myiter, 0, row[0])
self.modLista.set_value(myiter, 1, row[1])
self.modLista.set_value(myiter, 2, row[2])
E basicamente é isso, procurei detalhar o básico de forma objetiva. Talvez tenha deixado alguma dúvida pois o assunto é realmente longo para esmiuçar, por isso procurei expor um código o mais auto-explicável possível, e me coloco à disposição pra pra ajudar no que for preciso pra entender melhor. E finalmente, vai um print do aplicativo:
Post original no meu blog:
Desenvolvendo aplicações GUI simples em Python & Glade (PyGTK) com banco de dados SQLite - pedro-araujo.com