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.
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:- Chamar
msvcrt.getch()num loop até detectar “Enter” (b'\r'). - Se vier uma tecla normal, concatenar na senha e imprimir
*(sem pular linha). - 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()