associação pythonbrasil[11] django zope/plone planet Início Logado como (Entrar)

Diferenças para "GerandoPasswords"

Diferenças entre as versões de 9 e 10
Revisão 9e 2004-01-23 20:01:17
Tamanho: 8771
Editor: FelipeLessa
Comentário:
Revisão 10e 2004-02-15 20:46:27
Tamanho: 6557
Editor: 200-096-130-241
Comentário: melhorias no código
Deleções são marcadas assim. Adições são marcadas assim.
Linha 13: Linha 13:
* 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.
Nesta "nova versão" a interface foi totalmente remodelada, permitindo que a função '''handler_buttonsgenerate()''' fosse inutilizada pois não estava funcionando (sem motivo aparente). O código está mais simples também.
Linha 26: Linha 22:
# Pass Generator # Pass Generator - V 1.5
Linha 33: Linha 29:
# - Modificado por RodrigoNishino (2004/02/15):
# o Interface redesenhada.
# o Codigo foi simplificado.
Linha 48: Linha 47:
from random import choice
Linha 51: Linha 48:
    from anygui import *     import anygui as gui
Linha 57: Linha 54:
# Tamanho padrão do password
pass_tamanho = 5
### Função por onde todo o programa se desenrola
Linha 60: Linha 56:
# Conjuntos de letras
maius = "ABCDEFGHIJKLMNOPQRSTUVXWYZ"
minus = "abcdefghijklmnopqrstuvwxyz" # maius.lower()
numeros = "0123456789"
todas = maius + minus + numeros

# Exceções
class PassTamanhoException(Exception):
    """Usada quando o número de caracteres é inferior ou igual a zero."""
    pass

# Função por onde todo o programa se desenrola
def password(num_chars=pass_tamanho, conjunto=todas):
    """Gera uma senha aleatória de vezes dígitos baseado numa lista de caracteres passados
através da variável conjunto."""
    if num_chars<=0: # Não queremos senhas nulas ou negativas.
        raise PassTamanhoException # Aciona a exceção PassTamanhoException .

    lista = [] # Lista vazia para guardar caracteres temporariamente.

    for n in range(vezes): # Laço repetido o número de vezes especificado
        char = choice(conjunto) # Escolhe um caracterer da variável "a".
        lista.append(char) # Coloca o mesmo no fim da lista.

    result = "".join(lista) # Pega a senha recém-criada e põe em uma string vazia.
    return result # Retorna a string.
def cria(**kwds):
    carac = ""
    # Usei "abcd ...." ao invés de string.lowercase por que está acontecendo algum bug ...
    AoMenosUm = 0 # Solução utilizada para evitar bug quando nenhum dos checkboxes foi marcado
    if Check_az.on == 1:
        carac = carac + "abcdefghijklmnopqrstuvwxyz"
        AoMenosUm = 1
    if Check_AZ.on == 1:
        carac = carac + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        AoMenosUm = 1
    if Check_09.on == 1:
        carac = carac + "0123456789"
        AoMenosUm = 1
        if AoMenosUm:
        tamanho = TamanhoTField.text
        int_tamanho = int(tamanho)
        if int_tamanho < 5:
             Texto.text = "Tamanho muito pequeno"
        else:
            final = ""
            for p in range(int_tamanho):
                final = str(final) + str(choice(carac))
            Texto.text = final #pega a variável final e põe dentro de Texto.text
    else:
        Texto.text = "Parametros invalidos"
       
    
###
### Interface Gráfica
###
Linha 89: Linha 88:
    # Iniciar criação da GUI
    app = Application()
    
    janela = Window()
    janela.title = "Password Generator"
    
    texto = TextField()
    texto.hstretch = 1
    
    ### Botões de escolha
    # Todos os tipos de caracteres
    ball = Button()
    ball.position = 5, 65
    ball.text = "ToDa5"
    
    # Caracteres em letras minúsculas
    bmin = Button()
    bmin.text = "a-z"
    
    # ... em letras maiúsculas
    bmaius = Button()
    bmaius.text = "A-Z"
    
    # ... apenas números
    bnum = Button()
    bnum.text = "0-9"
Linha 116: Linha 89:
    # Cada botão com seu conjunto
    botao_conjunto = {ball: todas, bnum: numeros, bmaius: maius, bmin: minus}
    
    
    tamanho = TextField() # Espaço onde aparece o tamanho dos passwords.
    tamanho.text = str(pass_tamanho) # Texto que aparece por padrão quando o programa começa.
    
    bot_mais = Button()
    bot_mais.text = "+"
    
    bot_menos = Button()
    bot_menos.text = "-"
    
    titulo = Label(text="Cria novos passwords")
    
    
    
    janela.add(titulo, hstretch = 1)
    
    janela.add(texto, position=(0,30), right=5, hstretch=1)
    
    janela.add(ball, top=(texto, 5), hmove=0)
    janela.add(bmin, top=(ball,5), left = 5, hmove=0)
    janela.add(bmaius, top=(bmin,5), left = 5, hmove=0)
    janela.add(bnum, top=(bmaius,5), left = 5, hmove=0)
    
    janela.add(tamanho, top=(bnum, 15), left=5, width = 35, hmove=0)
    
    # Botoes de controle do tamanho do password
    janela.add(bot_menos, top=(tamanho, 15), left=5, width = 35, hmove=0)
    janela.add(bot_mais, top=(tamanho, 15), left=(bot_menos, 5), width = 35, hmove=0)
    
    janela.size = 180, 280
    
    #########
    ###### Funções que os botões acessam quando clicados
    #########
    
    def gerenerate_password(conjunto):
        """Função usada como wrapper para a função password em caso de erro como pass_tamanho inválido."""
        try:
            texto.text = password(pass_tamanho, conjunto)
        except PassTamanhoException:
            texto.text = "Tamanho inválido."
        except:
            texto.text = "Ocorreu um erro desconhecido."
            
    def handler_buttonsgenerate(event, source, time):
        """Função unificada para tratar eventos vindos dos botõs que geram senhas."""
        generate_password(botao_conjunto[source])
    
    def handler_size(event, source, time): ## * Ah esta função não funciona ... ignorem ela
        pass_tamanho = int(tamanho.text)
    
    def mais_tamanho(event, source, time):
        global pass_tamanho
        pass_tamanho = pass_tamanho + 1
        tamanho.text = pass_tamanho
    
    def menos_tamanho(event, source, time):
        global pass_tamanho
        pass_tamanho = pass_tamanho - 1
        tamanho.text = pass_tamanho
    
    ###
    # Associando os botões às suas respectivas funções
    ###
    
    link(ball, handler_buttonsgenerate)
    link(bmin, handler_buttonsgenerate)
    link(bmaius, handler_buttonsgenerate)
    link(bnum, handler_buttonsgenerate)
    link(bot_mais, mais_tamanho)
    link(bot_menos, menos_tamanho)
    
    app.add(janela) # Coloca a janela dentro do programa
    
    Programa = gui.Application()

    Janela = gui.Window(title="PassGenerator")
    Janela.size = 180, 105

    Texto = gui.TextField()
    Texto.width = Janela.width
    Texto.hstretch = 1
    Janela.add(Texto)

    OKButton = gui.Button(text="Criar Senha")
    OKButton.width = Janela.width - 20
    OKButton.hstretch = 1
    Janela.add(OKButton, top=(Texto, 5), left = 10)
    gui.link(OKButton, cria)

    Check_az = gui.CheckBox(text="a-z")
    Check_az.width = 60
    Check_az.on = 1
    Janela.add(Check_az, top=(OKButton, 5), left = 5)

    Check_AZ = gui.CheckBox(text="A-Z")
    Check_AZ.width = 60
    Janela.add(Check_AZ, top=(OKButton, 5), left=(Check_az, 5))

    Check_09 = gui.CheckBox(text="0-9")
    Check_09.width = 60
    Janela.add(Check_09, top=(OKButton, 5), left=(Check_AZ, 5))

    TamanhoLabel = gui.Label(text="Tamanho")
    TamanhoLabel.width = 50
    Janela.add(TamanhoLabel, top=(Check_az, 5), left = 5)

    TamanhoTField = gui.TextField()
    TamanhoTField.width = 50
    TamanhoTField.height = 17
    TamanhoTField.text = "5"
    Janela.add(TamanhoTField, top=(Check_az, 5), left=(TamanhoLabel, 5))

    Programa.add(Janela)
Linha 194: Linha 131:
        app.run() # Roda o programa         Programa.run()

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].

Nesta "nova versão" a interface foi totalmente remodelada, permitindo que a função handler_buttonsgenerate() fosse inutilizada pois não estava funcionando (sem motivo aparente). O código está mais simples também.

Código

   1 #!/usr/bin/env python
   2 # Pass Generator - V 1.5
   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 RodrigoNishino (2004/02/15):
  10 #     o Interface redesenhada.
  11 #     o Codigo foi simplificado.
  12 #  - Modificado por FelipeLessa para (2004/01/23):
  13 #     o Não aceitar números negativos. Obrigado por mostrar o problema RodrigoNishino.
  14 #     o Unificar funções que tratam os sinais recebidos pelos botões. Aquilo realmente era uma repetição.
  15 #  - Modificado por FelipeLessa para (2004/01/19):
  16 #     o Possibilitar a importação do arquivo sem que a instalação do anygui seja necessária.
  17 #  - Modificado por FelipeLessa para (2004/01/17):
  18 #     o Otimizar conjuntos de letras.
  19 #     o Utilizar "".join ao invés de laço for em password() . 
  20 #     o Retirar tag coding visto que quando o código for copiado & colado do Wiki ele pode ser alterado.
  21 #     o Texto que aparece por padrão deve corresponder ao especificado no início do arquivo.
  22 #     o Adicionada a possibilidade de importar arquivo sem abrir a janela.
  23 #     o Modificações menores.
  24 
  25 
  26 # Import's
  27 try:
  28     import anygui as gui
  29     anygui_disponivel = True   # Caso alguém queira a função apenas e não tenha o anygui.
  30 except ImportError:
  31     print "AVISO: Desabilitando interface gráfica."
  32     anygui_disponivel = False
  33 
  34 ### Função por onde todo o programa se desenrola
  35 
  36 def cria(**kwds):
  37     carac = ""
  38     # Usei "abcd ...." ao invés de string.lowercase por que está acontecendo algum bug ...
  39     AoMenosUm = 0 # Solução utilizada para evitar bug quando nenhum dos checkboxes foi marcado
  40     if Check_az.on == 1:
  41         carac = carac + "abcdefghijklmnopqrstuvwxyz"
  42         AoMenosUm = 1
  43     if Check_AZ.on == 1:
  44         carac = carac + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  45         AoMenosUm = 1
  46     if Check_09.on == 1:
  47         carac = carac + "0123456789"
  48         AoMenosUm = 1
  49         if AoMenosUm:
  50         tamanho = TamanhoTField.text
  51         int_tamanho = int(tamanho)
  52         if int_tamanho < 5:
  53              Texto.text = "Tamanho muito pequeno"
  54         else:
  55             final = ""
  56             for p in range(int_tamanho):
  57                 final = str(final) + str(choice(carac))
  58             Texto.text = final #pega a variável final e põe dentro de Texto.text
  59     else:
  60         Texto.text = "Parametros invalidos"
  61        
  62     
  63 ###
  64 ### Interface Gráfica
  65 ###
  66 
  67 if anygui_disponivel:
  68 
  69     Programa = gui.Application()
  70 
  71     Janela = gui.Window(title="PassGenerator")
  72     Janela.size = 180, 105
  73 
  74     Texto = gui.TextField()
  75     Texto.width = Janela.width
  76     Texto.hstretch = 1
  77     Janela.add(Texto)
  78 
  79     OKButton = gui.Button(text="Criar Senha")
  80     OKButton.width = Janela.width - 20
  81     OKButton.hstretch = 1
  82     Janela.add(OKButton, top=(Texto, 5), left = 10)
  83     gui.link(OKButton, cria)
  84 
  85     Check_az = gui.CheckBox(text="a-z")
  86     Check_az.width = 60
  87     Check_az.on = 1
  88     Janela.add(Check_az, top=(OKButton, 5), left = 5)
  89 
  90     Check_AZ = gui.CheckBox(text="A-Z")
  91     Check_AZ.width = 60
  92     Janela.add(Check_AZ, top=(OKButton, 5), left=(Check_az, 5))
  93 
  94     Check_09 = gui.CheckBox(text="0-9")
  95     Check_09.width = 60
  96     Janela.add(Check_09, top=(OKButton, 5), left=(Check_AZ, 5))
  97 
  98     TamanhoLabel = gui.Label(text="Tamanho")
  99     TamanhoLabel.width = 50
 100     Janela.add(TamanhoLabel, top=(Check_az, 5), left = 5)
 101 
 102     TamanhoTField = gui.TextField()
 103     TamanhoTField.width = 50
 104     TamanhoTField.height = 17
 105     TamanhoTField.text = "5"
 106     Janela.add(TamanhoTField, top=(Check_az, 5), left=(TamanhoLabel, 5))
 107 
 108     Programa.add(Janela)
 109 
 110     if __name__=="__main__":
 111         Programa.run()

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


FelipeLessa