Receita: Barra de Progresso para Uso Geral
Essa barra de progresso é para uso geral como: Adicionar registros no gtk.treeview e/ou Adicionar colunas no reportlab.
Conteúdo
Código para PyGTK
1 #-*- encoding: utf8 -*-
2
3 ##
4 # Esse programa é livre, você pode distribuir e/ou modifica-lo sob os
5 # termos da licença geral publica GNU publicada pela fundação de software
6 # livre (Free Software Foundation), contida na segunda versão da licença
7 # ou (em sua opinião) outra versão mais recente.
8 # Esse programa é distribuído na esperança de ser útil e satisfatório,
9 # mas DESTITUÍDO DE QUALQUER GARANTIA, destituído igualmente da
10 # COMPATIBILIDADE DE MÁQUINA ou CONVENIÊNCIA PARA PROPÓSITOS
11 # PARTICULARES. Veja a licença geral publica GNU para opter mais detalhes.
12 # http://www.gnu.org/copyleft/gpl.html
13 ##
14
15 ###############################################################################
16 ## Nome do Arquivo: minhabarra
17 ## Autor: Guedes, Maurilio<billguedes>
18 ## Data da Criação: 26/07/2005
19 ## Data da Modificação: 27/07/2005
20 ## Finalidade: Mostrar uma barra de progresso
21 ##
22 ##
23 ##
24 ###############################################################################
25
26 import pygtk
27 pygtk.require('2.0')
28 import gtk, gobject
29
30 class BarraProgresso:
31 '''Classe principal'''
32
33 def __init__(self):
34 '''Incialização padrão'''
35
36 self.texto= "";
37 self.registro= 1;
38 self.total_registro= 500;
39
40 def desenhar(self):
41 '''Desenha os widgets'''
42
43 # Cria uma janela comum
44 # self.janela = gtk.Window()
45 # self.janela = gtk.Window(gtk.WINDOW_TOPLEVEL)
46 self.janela = gtk.Window(gtk.WINDOW_POPUP)
47 self.janela.set_resizable(False)
48 self.janela.connect("destroy", self.fechar_janela)
49 self.janela.set_title("Barra de Progresso")
50 self.janela.set_border_width(0)
51 self.janela.set_position(gtk.WIN_POS_CENTER)
52
53 # Cria uma caixa vertical
54 vbox = gtk.VBox(False, 5)
55 vbox.set_border_width(10)
56 self.janela.add(vbox)
57
58 # Cria uma barra de progresso
59 self.barra_progresso = gtk.ProgressBar()
60 vbox.pack_start(self.barra_progresso, False, False, 0)
61
62 # Chamar o método desenhar_progresso a da 5 milisegundos
63 self.tempo = gobject.timeout_add(5, self.desenhar_progresso, self.barra_progresso)
64
65 # Cria uma separador
66 separador = gtk.HSeparator()
67 vbox.pack_start(separador, False, False, 0)
68
69 # Cria uma etiqueta
70 self.etiqueta= gtk.Label()
71 self.etiqueta.set_label(self.texto)
72 vbox.pack_start(self.etiqueta, False, False, 0)
73
74 # Mostra todas os widgets adicionados na janela
75 self.janela.show_all()
76
77 def escrever_texto(self, widget= None):
78 '''Escreve o texto na etiqueta'''
79
80 self.etiqueta.set_label(self.texto)
81
82 def desenhar_progresso(self, widget= None):
83 '''Desenha ou atualiza a barra de progressso'''
84
85 self.escrever_texto()
86
87 # Calculo flacionário para adequação da barra de progresso
88 valor= (float(self.registro) / self.total_registro)
89
90 # Caso seja 1 ou maior (100%) feche a tela
91 if valor >= 1: self.fechar_janela()
92
93 # Valor válido 0.0 à 1.0
94 self.barra_progresso.set_fraction(valor)
95
96 # Exibe a porcentagem
97 self.barra_progresso.set_text("%.2f%%" % (valor * 100))
98 return True
99
100 def fechar_janela(self, widget= None):
101 '''Fecha o aplicativo'''
102
103 # Remove a função relativa ao tempo (Timer)
104 gobject.source_remove(self.tempo)
105 gtk.main_quit()
Exemplo de uso
1 #-*- encoding: utf8 -*-
2
3 ##
4 # Esse programa é livre, você pode distribuir e/ou modifica-lo sob os
5 # termos da licença geral publica GNU publicada pela fundação de software
6 # livre (Free Software Foundation), contida na segunda versão da licença
7 # ou (em sua opinião) outra versão mais recente.
8 # Esse programa é distribuído na esperança de ser útil e satisfatório,
9 # mas DESTITUÍDO DE QUALQUER GARANTIA, destituído igualmente da
10 # COMPATIBILIDADE DE MÁQUINA ou CONVENIÊNCIA PARA PROPÓSITOS
11 # PARTICULARES. Veja a licença geral publica GNU para opter mais detalhes.
12 # http://www.gnu.org/copyleft/gpl.html
13 ##
14
15 ###############################################################################
16 ## Nome do Arquivo: teste.py
17 ## Autor: Guedes, Maurilio<billguedes>
18 ## Data da Criação: 26/07/2005
19 ## Data da Modificação: 27/07/2005
20 ## Finalidade: Testar o uso do arquivo minhabarra.py
21 ##
22 ##
23 ##
24 ###############################################################################
25
26 import pygtk
27 pygtk.require('2.0')
28 import gtk
29 import minhabarra
30
31 class Principal:
32 '''Classe principal'''
33
34 def __init__(self):
35 '''Incialização padrão'''
36
37 # Cria uma janela
38 janela= gtk.Window()
39 janela.connect("destroy", gtk.main_quit)
40
41 # Cria um botão
42 botao= gtk.Button("Executar")
43 botao.connect("clicked", self.executar)
44 janela.add(botao)
45
46 # Mostra todas os widgets adicionados na janela
47 janela.show_all()
48
49 def executar(self, widget= None):
50 '''Executa o código abaixo'''
51
52 # Carrega a classe 'BarraProgresso'
53 barra= minhabarra.BarraProgresso()
54 barra.texto= "Começando o Processo..."
55
56 # Muda a variável registro da classe 'BarraProgresso'
57 barra.registro= 0
58
59 # Muda a variável total_registro da classe 'BarraProgresso'
60 barra.total_registro= 15000
61
62 # Desenha os widgets da classe 'BarraProgresso'
63 barra.desenhar()
64
65 # Loop ilustrativo, mas poderia ser uma lista de clientes
66 for i in range(barra.total_registro):
67
68 # Depuração do código
69 print "Estou no for imprimindo %s\n" % i
70
71 # Mostra mais informação ao usuário
72 barra.texto= "Estou Processando o Cliente '%05d'" % barra.registro
73
74 # Muda novamente a variavel registro, ou melhor, acrescenta +1 na variável
75 barra.registro+= 1
76
77 # Pausa o processo e espera a execução do "Timer"
78 gtk.mainiteration()
79
80 # Chama a classe 'Principal'
81 p= Principal()
82
83 # Inicia o aplicativo
84 gtk.main()
Barra de progresso no Console
A biblioteca utilizada para a barra de progresso no console é a progressbar criado por Nilton Volpato disponível em http://cheeseshop.python.org/pypi/progressbar/2.2
1 from progressbar import *
2 def example1():
3 widgets = ['Test: ', Percentage(), ' ', Bar(marker=RotatingMarker()),' ', ETA(), ' ', FileTransferSpeed()]
4 pbar = ProgressBar(widgets=widgets, maxval=20000000).start()
5 for i in range(2000000):
6 pbar.update(10*i+1)
7 pbar.finish()
8 example1()
9 raw_input()
ou
1 import sys
2
3 def progress_bar(value, max, barsize):
4 chars = int(value * barsize / float(max))
5 percent = int((value / float(max)) * 100)
6 sys.stdout.write("#" * chars)
7 sys.stdout.write(" " * (barsize - chars + 2))
8 if value >= max:
9 sys.stdout.write("done. \n\n")
10 else:
11 sys.stdout.write("[%3i%%]\r" % (percent))
12 sys.stdout.flush()
13
14 import time
15 print "processing..."
16 for i in xrange(11):
17 progress_bar(i, 10, 40)
18 time.sleep(1)
19 print "ok"
20 raw_input()
Guedes, Maurilio <billguedes.python at terra.com.br>
Volta para CookBook.