Fazer um programa para cadastro e diálogo de login. O programa deve:
Cadastrar uma senha do usuário via teclado. Esta segue as mesmas regras do nome de usuário, com a diferença de que são exibidos somente asteriscos no console à medida que a senha é digitada.

Passo 1

Beleza! O enunciado pede que a gente faça um programinha que:
  • Cadastre um usuário (nome + senha).
  • Na hora de digitar a senha, só mostre asteriscos no console.
  • Depois implemente um diálogo de “login” que pede nome e senha e verifica se bate com o cadastro.
Conteúdo envolvido:
  • Entrada de dados pelo teclado (strings).
  • Laço de repetição pra capturar caractere a caractere.
  • Tratamento de backspace (caso o usuário apague).
  • Impressão de “*” em vez da senha real.
O que vamos precisar:
  • Uma função que leia a senha ocultando-a (exibindo “*”).
  • Variáveis para guardar usuário e senha.
  • Um laço de comparação no login.

Passo 2

Entender como ler caractere a caractere no console. Em Python, no Windows, a gente pode usar o módulo msvcrt.getch(). Em Unix você usaria termios, mas pra ficar simples vou mostrar em Windows (o raciocínio vale para qualquer plataforma). A ideia:
  1. Chamar msvcrt.getch() num loop até detectar “Enter” (b'\r').
  2. Se vier uma tecla normal, concatenar na senha e imprimir * (sem pular linha).
  3. Se vier backspace (b'\x08') e a senha não estiver vazia, remover o último caractere e mover o cursor pra trás (geralmente com '\b \b').

Passo 3

Vamos criar a função read_password() assim:
import msvcrt

def read_password(prompt='Senha: '):
    print(prompt, end='', flush=True)
    pw = ''
    while True:
        ch = msvcrt.getch()
        if ch == b'\r':           # Enter
            print()               # pula linha
            break
        elif ch == b'\x08':       # Backspace
            if len(pw) > 0:
                pw = pw[:-1]
                # apaga o '*' exibido
                print('\b \b', end='', flush=True)
        else:
            # caractere normal
            pw += ch.decode('utf-8')
            print('*', end='', flush=True)
    return pw
Explicando a teoria:
  • msvcrt.getch() lê um byte sem eco no console.
  • b'\r' representa a tecla Enter.
  • b'\x08' é o código de backspace.
  • print('\b \b', end='') manda o cursor pra trás, imprime espaço (apagando o *) e volta de novo.

Passo 4

Agora montamos o cadastro e o diálogo de login:
def main():
    # Cadastro
    usuario = input('Cadastre seu usuário: ')
    senha_cadastrada = read_password('Cadastre sua senha: ')
    print('\nUsuário e senha cadastrados com sucesso!\n')

    # Login
    print('--- Faça login ---')
    usuario_login = input('Usuário: ')
    senha_login = read_password('Senha: ')

    # Verificação
    if usuario_login == usuario and senha_login == senha_cadastrada:
        print('Login efetuado! Bem-vindo,', usuario_login)
    else:
        print('Usuário ou senha inválidos!')
Teoria aplicada:
  • input() lê uma string até o usuário apertar Enter.
  • Na verificação, usamos comparação de strings (==).
  • Se bater, sucesso; senão, erro.

Resposta

Segue o programa completo em Python (Windows) que cadastra usuário e senha, mostra * enquanto digita a senha e faz o login:
import msvcrt

def read_password(prompt='Senha: '):
    print(prompt, end='', flush=True)
    pw = ''
    while True:
        ch = msvcrt.getch()
        if ch == b'\r':
            print()
            break
        elif ch == b'\x08':
            if len(pw) > 0:
                pw = pw[:-1]
                print('\b \b', end='', flush=True)
        else:
            pw += ch.decode('utf-8')
            print('*', end='', flush=True)
    return pw

def main():
    usuario = input('Cadastre seu usuário: ')
    senha_cadastrada = read_password('Cadastre sua senha: ')
    print('\nUsuário e senha cadastrados com sucesso!\n')

    print('--- Faça login ---')
    usuario_login = input('Usuário: ')
    senha_login = read_password('Senha: ')

    if usuario_login == usuario and senha_login == senha_cadastrada:
        print('Login efetuado! Bem-vindo,', usuario_login)
    else:
        print('Usuário ou senha inválidos!')

if __name__ == '__main__':
    main()

Exercícios relacionados