6
respostas

Opção invalida após cadastrar o novo restaurante.

import os

restaurantes = [{'nome':'zai', 'categorias':'japonesa', 'ativo':False}, 
                {'nome':'pizza Suprema', 'categorias':'italiana', 'ativo':True},
                {'nome':'mucubun', 'categorias':'sumerio', 'ativo':False}]
            

def exibir_nome_do_programa():
    print("""

""")

def exibir_opcoes():
    print('1. Cadastrar restaurante')
    print('2. Listar restaurantes')
    print('3. Ativar restaurante')
    print('4. Sair\n')

def finalizar_app():
    exibir_subtitulo('Finalizar app')

def voltar_ao_menu_principal():
    input('\nDigite uma tecla para voltar ao menu ')
    main()

def opcao_invalida():
    print('Opção inválida!\n')
    voltar_ao_menu_principal()

def exibir_subtitulo(texto):
    os.system('cls')
    print(texto)
    print()

def cadastrar_novo_restaurante():
    exibir_subtitulo('Cadastro de novos restaurantes')
    nome_do_restaurante = input('Digite o nome do restaurante que deseja cadastrar: ')
    Categoria = input(f'digite a categoria do restaurante {nome_do_restaurante}: ')
    dados_do_restaurante = {'nome':nome_do_restaurante,'categoria':Categoria, 'ativo':False}
    restaurantes.append(dados_do_restaurante)
   
    print(f'O restaurante {nome_do_restaurante} foi cadastrado com sucesso!')
    
    voltar_ao_menu_principal()

def listar_restaurantes():
    exibir_subtitulo('Listando restaurantes')

    for restaurante in restaurantes:
        nome_restaurante = restaurante['nome']
        categorias = restaurante['categorias']
        ativo = restaurante['ativo']
        print(f'- {nome_restaurante} | {categorias} | {ativo}')

    voltar_ao_menu_principal()

def escolher_opcao():
    try:
        opcao_escolhida = int(input('Escolha uma opção: '))
        # opcao_escolhida = int(opcao_escolhida)

        if opcao_escolhida == 1: 
            cadastrar_novo_restaurante()
        elif opcao_escolhida == 2: 
            listar_restaurantes()
        elif opcao_escolhida == 3: 
            print('Ativar restaurante')
        elif opcao_escolhida == 4: 
            finalizar_app()
        else: 
            opcao_invalida()
    except:
        opcao_invalida()

def main():
    os.system('cls')
    exibir_nome_do_programa()
    exibir_opcoes()
    escolher_opcao()

if __name__ == '__main__':
    main()
6 respostas

Oii, Enos, tudo certo por aí?

O problema parece estar na função voltar_ao_menu_principal, que chama a main novamente. Quando main é chamada, ela exibe as opções e chama escolher_opcao. Se houver qualquer problema na entrada do usuário, a função opcao_invalida é chamada, o que pode estar causando o loop.

Então, pra lidar com isso, vamos ajustar a função voltar_ao_menu_principal.

Você pode modificar o código deste jeito:

import os

restaurantes = [{'nome':'zai', 'categorias':'japonesa', 'ativo':False}, 
                {'nome':'pizza Suprema', 'categorias':'italiana', 'ativo':True},
                {'nome':'mucubun', 'categorias':'sumerio', 'ativo':False}]

def exibir_nome_do_programa():
    print("""
    """)

def exibir_opcoes():
    print('1. Cadastrar restaurante')
    print('2. Listar restaurantes')
    print('3. Ativar restaurante')
    print('4. Sair\n')

def finalizar_app():
    exibir_subtitulo('Finalizar app')

def voltar_ao_menu_principal():
    input('\nDigite uma tecla para voltar ao menu ')
    os.system('cls')
    exibir_nome_do_programa()
    exibir_opcoes()
    escolher_opcao()

def opcao_invalida():
    print('Opção inválida!\n')
    voltar_ao_menu_principal()

def exibir_subtitulo(texto):
    os.system('cls')
    print(texto)
    print()

def cadastrar_novo_restaurante():
    exibir_subtitulo('Cadastro de novos restaurantes')
    nome_do_restaurante = input('Digite o nome do restaurante que deseja cadastrar: ')
    categoria = input(f'Digite a categoria do restaurante {nome_do_restaurante}: ')
    dados_do_restaurante = {'nome': nome_do_restaurante, 'categorias': categoria, 'ativo': False}
    restaurantes.append(dados_do_restaurante)

    print(f'O restaurante {nome_do_restaurante} foi cadastrado com sucesso!')
    voltar_ao_menu_principal()

def listar_restaurantes():
    exibir_subtitulo('Listando restaurantes')

    for restaurante in restaurantes:
        nome_restaurante = restaurante['nome']
        categorias = restaurante['categorias']
        ativo = restaurante['ativo']
        print(f'- {nome_restaurante} | {categorias} | {ativo}')

    voltar_ao_menu_principal()

def escolher_opcao():
    try:
        opcao_escolhida = int(input('Escolha uma opção: '))

        if opcao_escolhida == 1: 
            cadastrar_novo_restaurante()
        elif opcao_escolhida == 2: 
            listar_restaurantes()
        elif opcao_escolhida == 3: 
            print('Ativar restaurante')
            voltar_ao_menu_principal()
        elif opcao_escolhida == 4: 
            finalizar_app()
        else: 
            opcao_invalida()
    except ValueError:
        opcao_invalida()

def main():
    os.system('cls')
    exibir_nome_do_programa()
    exibir_opcoes()
    escolher_opcao()

if __name__ == '__main__':
    main()

As alteraçoes que fizemos foram estas:

  • Correção da chave 'categorias' no dicionário dados_do_restaurante para corresponder a da lista inicial.
  • Adicionar a função voltar_ao_menu_principal para limpar a tela e exibir o menu principal.
  • Ajustar a função escolher_opcao para chamar a voltar_ao_menu_principal após a opção 3.

Se a dúvida persistir, estamos aqui.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Maria Isabel, boa tarde!

Estou com o mesmo erro no meu código que o colega Enos.

Eu entro com o nome do restaurante. Coloco a categoria, pressiono enter, e logo em seguida recebo sem mais nem menos a mensagem de opção inválida.

Outra coisa, depois do processo acima ele deixa de executar o código abaixo:

    dados_do_restaurante = {'nome': nome_do_restaurante, 'categorias': categoria, 'ativo': False}
    restaurantes.append(dados_do_restaurante)

    print(f'O restaurante {nome_do_restaurante} foi cadastrado com sucesso!')
    voltar_ao_menu_principal()

Também não consigo visualizar na função "def cadastrar_novo_restaurante():" nada que chame a função "def opcao_invalida():".

Outra coisa, porque a função def voltar_ao_menu_principal(): está quase igual a opção def main()?

Ao colocar o except ValueError: quando mandava executar o programa deva erro.

Vou continuar brigando com o código até ele me contar toda a verdade, mas caso ele fique muito resistente conto com a ajuda dos colegas da Alura.

Consegue colocar o código inteiro aqui?

Bom dia!

Conforme solicitado encaminho a integra do código.

import os

# restaurantes = ['Peixe na rede', 'Calzonne', 'Giraffas', 'MacDonalds', 'La Torreza', 'Burger King', 'Portugal e seus Sabores', 'Amor a Massa', 'Delicias de Araxa']
restaurantes = [{'nome':'Peixe na rede', 'categoria':'Natural', 'ativo':'False'},
            {'nome':'Calzonne', 'categoria':'Rapida', 'ativo':'true'},
            {'nome':'Giraffas', 'categoria':'Rapida', 'ativo':'true'},
            {'nome':'MacDonalds', 'categoria':'Rapida', 'ativo':'false'},
                {'nome':'La Torreza', 'categoria':'Servi Service', 'ativo':'false'},
                {'nome':'Burger King','categoria':'Rapida', 'ativo':'true'},
                {'nome':'Portugal e seus Sabores','categoria':'Portuguesa', 'ativo':'true'},
                {'nome':'Amor a Massa','categoria':'Massas', 'ativo':'false'},
                {'nome':'Nosso Pao','categoria':'Massas', 'ativo':'false'},
                {'nome':'Delicias de Araxa','categoria':'Mineira', 'ativo':'true'}]

def exibir_nome_do_programa():
    print('\n')
    print('Sabor Express\n')

def exibir_opcoes():
    print('1.Cadastrar Restaurante')
    print('2.Listar Restaurante')
    print('3.Ativar Restaurante')
    print('4.Sair \n')

def finalizar():
    exibir_subtitulo("Finalizar o app")
    print("")

def opcao_invalida():
    print("Opçao Invalida!\n")
    input("Digite uma tecla para voltar")
    main()

def voltar_ao_menu():
    print('\nDigite uma tecla para voltar ao menu principal.')
    os.system('clear')
    exibir_nome_do_programa()
    exibir_opcoes()
    escolher_opcoes()
#    main()

def exibir_subtitulo(texto):
    os.system('clear')
    print(texto)

def cadastrar_novo_restaurante():
    exibir_subtitulo('Cadastro de novos restaurantes.')
    nome_do_restaurante = input('Digite o nome do restaurante que deseja cadastrar: ')
    categoria = input(f'Digite a categoria do restaurante {nome_do_restaurante}: ')
    dados_do_restaurante = {'nome':nome_do_restaurante, 'categoria':categoria, 'ativo': False}
    restaurantes.append(dados_do_restaurante)

    print(f'O restaurante {nome_do_restaurante} foi cadastrado com sucesso!')
    voltar_ao_menu()

def listar_restaurantes():
    exibir_subtitulo('Listando restaurantes: \n')
    for restaurante in restaurantes:
        nome_restaurante = restaurante['nome']
        categorias = restaurante['categoria']
        ativo = restaurante['ativo']
#        print(f'.{restaurante}')
        print(f'# {nome_do_restaurante} | {categoria} | {ativo}')
    sleep()
    voltar_ao_menu()

def escolher_opcoes():
    try:
        opcao_escolhida = int(input('Escolha uma opção: '))

        if opcao_escolhida == 1:
            cadastrar_novo_restaurante()
        elif opcao_escolhida == 2:
            listar_restaurantes()
        elif opcao_escolhida == 3:
            print("Ativar Restaurante")
        elif opcao_escolhida == 4:
            finalizar()
        else:
            opcao_invalida()
    except:
        opcao_invalida()

def main():
    os.system('clear')
    exibir_nome_do_programa()
    exibir_opcoes()
    escolher_opcoes()

if __name__ == '__main__':
    main()

Oi! Tudo bem?

Eu testei o código, vi que o problema é na parte de listar os restaurantes mesmo.

Você não definiu as variáveis para nome_do_restaurante e categoria, então para a função print() imprimir os restaurantes, elas teriam que ser definidas. Você pode trocar categorias para categoria ou vice-versa, mas é necessário que seja apenas uma delas tanto para a definição quanto para a hora de chamar na impressão. E o mesmo vale para nome_restaurante e nome_do_restaurante.

Lembrando que você deixou o 'False' e 'True' entre aspas simples, então é recomendado você deixar sem as aspas. Isso porque elas são tipos booleanos.

No seu código, notei que você adicionou a função sleep(). A parte de "Opção Inválida" aparece após listar os restaurantes (mesmo após a correção dela). Alterei algumas coisas no seu código para ele funcionar certinho sem mostrar que tem a opção inválida:

import os
import time 

restaurantes = [
    {'nome': 'Peixe na rede', 'categoria': 'Natural', 'ativo': False},
    {'nome': 'Calzonne', 'categoria': 'Rapida', 'ativo': True},
    {'nome': 'Giraffas', 'categoria': 'Rapida', 'ativo': True},
    {'nome': 'MacDonalds', 'categoria': 'Rapida', 'ativo': False},
    {'nome': 'La Torreza', 'categoria': 'Servi Service', 'ativo': False},
    {'nome': 'Burger King', 'categoria': 'Rapida', 'ativo': True},
    {'nome': 'Portugal e seus Sabores', 'categoria': 'Portuguesa', 'ativo': True},
    {'nome': 'Amor a Massa', 'categoria': 'Massas', 'ativo': False},
    {'nome': 'Nosso Pao', 'categoria': 'Massas', 'ativo': False},
    {'nome': 'Delicias de Araxa', 'categoria': 'Mineira', 'ativo': True}
]

def exibir_nome_do_programa():
    print('\n')
    print('Sabor Express\n')

def exibir_opcoes():
    print('1. Cadastrar Restaurante')
    print('2. Listar Restaurante')
    print('3. Ativar Restaurante')
    print('4. Sair \n')

def finalizar():
    exibir_subtitulo("Finalizar o app")
    print("")

def opcao_invalida():
    print("Opção Inválida!\n")
    input("Digite uma tecla para voltar")
    main()

def voltar_ao_menu():
    print('\nDigite uma tecla para voltar ao menu principal.')
    input()  # Pausa para o usuário pressionar uma tecla
    os.system('clear')
    exibir_nome_do_programa()
    exibir_opcoes()
    escolher_opcoes()

def exibir_subtitulo(texto):
    os.system('clear')
    print(texto)

def cadastrar_novo_restaurante():
    exibir_subtitulo('Cadastro de novos restaurantes.')
    nome_do_restaurante = input('Digite o nome do restaurante que deseja cadastrar: ')
    categoria = input(f'Digite a categoria do restaurante {nome_do_restaurante}: ')
    dados_do_restaurante = {'nome': nome_do_restaurante, 'categoria': categoria, 'ativo': 'false'}
    restaurantes.append(dados_do_restaurante)

    print(f'O restaurante {nome_do_restaurante} foi cadastrado com sucesso!')
    voltar_ao_menu()

def listar_restaurantes():
    exibir_subtitulo('Listando restaurantes: \n')
    for restaurante in restaurantes:
        nome_do_restaurante = restaurante['nome']
        categoria = restaurante['categoria']
        ativo = restaurante['ativo']
        print(f' {nome_do_restaurante} | {categoria} | {ativo}')
    time.sleep(2)  # Pausa de 2 segundos antes de voltar ao menu
    voltar_ao_menu()

def escolher_opcoes():
    try:
        opcao_escolhida = int(input('Escolha uma opção: '))

        if opcao_escolhida == 1:
            cadastrar_novo_restaurante()
        elif opcao_escolhida == 2:
            listar_restaurantes()
        elif opcao_escolhida == 3:
            print("Ativar Restaurante")
        elif opcao_escolhida == 4:
            finalizar()
        else:
            opcao_invalida()
    except ValueError:
        opcao_invalida()

def main():
    os.system('clear')
    exibir_nome_do_programa()
    exibir_opcoes()
    escolher_opcoes()

if __name__ == '__main__':
    main()

Além do que comentei acima, importamos a biblioteca time, pra usar a função sleep(). Também colocamos um input para o usuário entrar uma tecla, assim como fizemos antes, e ter essa pausa. E fizemos um tratamento de exceção específico: em escolher_opcoes, o except agora captura apenas ValueError, que é o erro esperado se a conversão de input para int falhar.

E, para responder a sua última pergunta: as funções são parecidas poisa principal razão para ter essas duas funções semelhantes é a necessidade de limpar a tela e exibir o menu em duas situações diferentes: no início do programa (com a função main()) e após executar uma operação (com a voltar_ao_menu().

Se outra dúvida surgir, fique à vontade para postar. Recomendo abrir um novo tópico para focarmos mais nos seus posts, tá bem? ^_^

Abraços!

Maria Isabel, boa tarde!

Fiz as modificações conforme orientado por você, e todas funcionaram muito bem.

Agradeço a ajuda e o tempo dispensado.