Gerando Password
Essa descrição foi criada por FelipeLessa com alguns comentários do RodrigoNishino (aparece com um * na frente). Veja a seção Autor abaixo.
O programa Pass Generator cria senhas aleatórias a partir de uma série de caracteres. Os caracteres que serão usados para criar a senha e o número de caracteres da mesma são selecionados pelo usuário.
Para a criação da senha em si é usada a função padrão do python random.choice(), que escolhe (óbvio, não? ) um item de uma sequência aleatoriamente, sendo que a sequência em questão são os caracteres em si. Por isso o programa não leva em consideração senhas muito fáceis ou dificeis que ocasinalmente possam ser criadas.
A interface é construída em anygui. Pegue-o para as plataformas *nix e Windows em [http://anygui.sourceforge.net/ anygui.sf.net].
* O programa é bem simples e tem alguns bugs como por exemplo, se você coloca um numero negativo ele não faz senha nenhuma.
Obs.: Já foi corrigido. Se o RodrigoNishino quiser, altere a frase acima e retire essa. -- FelipeLessa
* Além disso, se você segura o botão "+" ou "-" nada acontece ... ainda vou melhorar isto.
Código
1 #!/usr/bin/env python
2 # Pass Generator
3 # Rodrigo Calanca Nishino
4 #
5 # Programa simples que gera passwords
6 # Atenção: Ele usa o anygui (anygui.sourceforge.net)
7 #
8 # ChangeLog:
9 # - Modificado por FelipeLessa para (2004/01/23):
10 # o Não aceitar números negativos. Obrigado por mostrar o problema RodrigoNishino.
11 # o Unificar funções que tratam os sinais recebidos pelos botões. Aquilo realmente era uma repetição.
12 # - Modificado por FelipeLessa para (2004/01/19):
13 # o Possibilitar a importação do arquivo sem que a instalação do anygui seja necessária.
14 # - Modificado por FelipeLessa para (2004/01/17):
15 # o Otimizar conjuntos de letras.
16 # o Utilizar "".join ao invés de laço for em password() .
17 # o Retirar tag coding visto que quando o código for copiado & colado do Wiki ele pode ser alterado.
18 # o Texto que aparece por padrão deve corresponder ao especificado no início do arquivo.
19 # o Adicionada a possibilidade de importar arquivo sem abrir a janela.
20 # o Modificações menores.
21
22
23 # Import's
24 from random import choice
25
26 try:
27 from anygui import *
28 anygui_disponivel = True # Caso alguém queira a função apenas e não tenha o anygui.
29 except ImportError:
30 print "AVISO: Desabilitando interface gráfica."
31 anygui_disponivel = False
32
33 # Tamanho padrão do password
34 pass_tamanho = 5
35
36 # Conjuntos de letras
37 maius = "ABCDEFGHIJKLMNOPQRSTUVXWYZ"
38 minus = "abcdefghijklmnopqrstuvwxyz" # maius.lower()
39 numeros = "0123456789"
40 todas = maius + minus + numeros
41
42 # Exceções
43 class PassTamanhoException(Exception):
44 """Usada quando o número de caracteres é inferior ou igual a zero."""
45 pass
46
47 # Função por onde todo o programa se desenrola
48 def password(num_chars=pass_tamanho, conjunto=todas):
49 """Gera uma senha aleatória de vezes dígitos baseado numa lista de caracteres passados
50 através da variável conjunto."""
51 if num_chars<=0: # Não queremos senhas nulas ou negativas.
52 raise PassTamanhoException # Aciona a exceção PassTamanhoException .
53
54 lista = [] # Lista vazia para guardar caracteres temporariamente.
55
56 for n in range(vezes): # Laço repetido o número de vezes especificado
57 char = choice(conjunto) # Escolhe um caracterer da variável "a".
58 lista.append(char) # Coloca o mesmo no fim da lista.
59
60 result = "".join(lista) # Pega a senha recém-criada e põe em uma string vazia.
61 return result # Retorna a string.
62
63
64 if anygui_disponivel:
65 # Iniciar criação da GUI
66 app = Application()
67
68 janela = Window()
69 janela.title = "Password Generator"
70
71 texto = TextField()
72 texto.hstretch = 1
73
74 ### Botões de escolha
75 # Todos os tipos de caracteres
76 ball = Button()
77 ball.position = 5, 65
78 ball.text = "ToDa5"
79
80 # Caracteres em letras minúsculas
81 bmin = Button()
82 bmin.text = "a-z"
83
84 # ... em letras maiúsculas
85 bmaius = Button()
86 bmaius.text = "A-Z"
87
88 # ... apenas números
89 bnum = Button()
90 bnum.text = "0-9"
91
92 # Cada botão com seu conjunto
93 botao_conjunto = {ball: todas, bnum: numeros, bmaius: maius, bmin: minus}
94
95
96 tamanho = TextField() # Espaço onde aparece o tamanho dos passwords.
97 tamanho.text = str(pass_tamanho) # Texto que aparece por padrão quando o programa começa.
98
99 bot_mais = Button()
100 bot_mais.text = "+"
101
102 bot_menos = Button()
103 bot_menos.text = "-"
104
105 titulo = Label(text="Cria novos passwords")
106
107
108
109 janela.add(titulo, hstretch = 1)
110
111 janela.add(texto, position=(0,30), right=5, hstretch=1)
112
113 janela.add(ball, top=(texto, 5), hmove=0)
114 janela.add(bmin, top=(ball,5), left = 5, hmove=0)
115 janela.add(bmaius, top=(bmin,5), left = 5, hmove=0)
116 janela.add(bnum, top=(bmaius,5), left = 5, hmove=0)
117
118 janela.add(tamanho, top=(bnum, 15), left=5, width = 35, hmove=0)
119
120 # Botoes de controle do tamanho do password
121 janela.add(bot_menos, top=(tamanho, 15), left=5, width = 35, hmove=0)
122 janela.add(bot_mais, top=(tamanho, 15), left=(bot_menos, 5), width = 35, hmove=0)
123
124 janela.size = 180, 280
125
126 #########
127 ###### Funções que os botões acessam quando clicados
128 #########
129
130 def gerenerate_password(conjunto):
131 """Função usada como wrapper para a função password em caso de erro como pass_tamanho inválido."""
132 try:
133 texto.text = password(pass_tamanho, conjunto)
134 except PassTamanhoException:
135 texto.text = "Tamanho inválido."
136 except:
137 texto.text = "Ocorreu um erro desconhecido."
138
139 def handler_buttonsgenerate(event, source, time):
140 """Função unificada para tratar eventos vindos dos botõs que geram senhas."""
141 generate_password(botao_conjunto[source])
142
143 def handler_size(event, source, time): ## * Ah esta função não funciona ... ignorem ela
144 pass_tamanho = int(tamanho.text)
145
146 def mais_tamanho(event, source, time):
147 global pass_tamanho
148 pass_tamanho = pass_tamanho + 1
149 tamanho.text = pass_tamanho
150
151 def menos_tamanho(event, source, time):
152 global pass_tamanho
153 pass_tamanho = pass_tamanho - 1
154 tamanho.text = pass_tamanho
155
156 ###
157 # Associando os botões às suas respectivas funções
158 ###
159
160 link(ball, handler_buttonsgenerate)
161 link(bmin, handler_buttonsgenerate)
162 link(bmaius, handler_buttonsgenerate)
163 link(bnum, handler_buttonsgenerate)
164 link(bot_mais, mais_tamanho)
165 link(bot_menos, menos_tamanho)
166
167 app.add(janela) # Coloca a janela dentro do programa
168
169 if __name__=="__main__":
170 app.run() # Roda o programa
Autor
Felipe, escreva aqui alguma coisa sobre essa aplicação. Conte um pouco da história dela e fale um pouco sobre o funcionamento dela também. -- OsvaldoSantanaNeto
Eu não sou o autor do Pass Generator, devo deixar claro, e sim Rodrigo Calanca Nishino, como descrito no cabeçalho do programa. Ele aparentemente não criou uma descrição para este aplicativo e, a pedidos de OsvaldoSantanaNeto, eu criei uma simples baseada no código (para dizer a verdade, nem cheguei a rodar o programa visto que não possuo o anygui no meu computador). Rodrigo, se você vier aqui de novo, por favor faça as alterações necessárias. -- FelipeLessa
"Antes de tudo, gostaria de agradecer ao FelipeLessa pelos trechos de código, aprendi novas coisas com a colaboração dele. O programa surgiu para mostrar para um colega meu que Python poderia fazer programas gráficos também. Como eu sou um newbie em Python , meu primeiro script imprimia na tela um monte de texto randômico ... (acredite eu sou fissurado neste módulo random) e para não perder as raízes ... decidi fazer meu primeiro programa gráfico semelhante ao meu primeiro script. Ele me garantiu que se ele tentasse fazer este mesmo programa em VB ele seria no mínimo umas 3 vezes maior.
O programa não é lá uma maravilha, particularmente eu questiono a aplicabilidade dele, porém baseado no que eu aprendi nele, pretendo construir aplicações maiores ou pelo menos mais úteis que o PassGenerator (aliás esse nome é horrível). Sem dúvida que se não fosse graças PythonBrasil eu não teria sequer me metido com interfaces gráficas... permaneceria no meu programa de escrever coisas randomicas na tela" -- RodrigoNishino