Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Bug] [Erro] Não consigo adicionar novo restaurante

Quando eu adiciono novo restautante, aparece "opção invalida!" ao invés do novo restaurante adicionado

import os

restaurantes = [{'nome':'Praça', 'categoria':'Japonesa', 'ativo':False},
                {'nome':'Pizza Suprema', 'categoria':'Pizza', 'ativo':True},
                {'nome':'Petis','categoria':'Hambuguer','ativo':True}]

def exibir_nome():
  print("""
░█████╗░██╗░░██╗██╗███╗░░██╗░█████╗░██╗░░██╗██╗██╗░░░░░░█████╗░
██╔══██╗██║░░██║██║████╗░██║██╔══██╗██║░░██║██║██║░░░░░██╔══██╗
██║░░╚═╝███████║██║██╔██╗██║██║░░╚═╝███████║██║██║░░░░░███████║
██║░░██╗██╔══██║██║██║╚████║██║░░██╗██╔══██║██║██║░░░░░██╔══██║
╚█████╔╝██║░░██║██║██║░╚███║╚█████╔╝██║░░██║██║███████╗██║░░██║
░╚════╝░╚═╝░░╚═╝╚═╝╚═╝░░╚══╝░╚════╝░╚═╝░░╚═╝╚═╝╚══════╝╚═╝░░╚═╝

██████╗░███████╗░██████╗████████╗░█████╗░██╗░░░██╗██████╗░░█████╗░███╗░░██╗████████╗███████╗░██████╗
██╔══██╗██╔════╝██╔════╝╚══██╔══╝██╔══██╗██║░░░██║██╔══██╗██╔══██╗████╗░██║╚══██╔══╝██╔════╝██╔════╝
██████╔╝█████╗░░╚█████╗░░░░██║░░░███████║██║░░░██║██████╔╝███████║██╔██╗██║░░░██║░░░█████╗░░╚█████╗░
██╔══██╗██╔══╝░░░╚═══██╗░░░██║░░░██╔══██║██║░░░██║██╔══██╗██╔══██║██║╚████║░░░██║░░░██╔══╝░░░╚═══██╗
██║░░██║███████╗██████╔╝░░░██║░░░██║░░██║╚██████╔╝██║░░██║██║░░██║██║░╚███║░░░██║░░░███████╗██████╔╝
╚═╝░░╚═╝╚══════╝╚═════╝░░░░╚═╝░░░╚═╝░░╚═╝░╚═════╝░╚═╝░░╚═╝╚═╝░░╚═╝╚═╝░░╚══╝░░░╚═╝░░░╚══════╝╚═════╝░
        """)

def exibir_opcoes():
    print("1. Cadastrar restaurante.")
    print("2. Listar restaurantes")
    print("3. Ativar restaurante")
    print("4. Sair\n")
    
def voltar_ao_menu_principal():
    input("Digite uma tecla para voltar ao menu principal\n")
    print()
    main()

def imprimir_subtitulo(texto):
    print(texto)
    

def cadastrar_restaurantes():
    imprimir_subtitulo("Cadastrando novo resturante\n")
    os.system('cls')
    nome_do_restaurante = input("Digite o nome do restaurante que deseja cadastrar:\n")
    categoria_do_restaurante = input(f'Digite a categoria do restaunte {nome_do_restaurante}\n')
    dados_do_retaurante = [{f'nome':{nome_do_restaurante}, 'categoria':{categoria_do_restaurante}, 'ativo':False}]
    restaurantes.append(dados_do_retaurante)
    print(restaurantes)
    print(f"Restaurante {nome_do_restaurante} cadastrado com sucesso")
    voltar_ao_menu_principal()
    
def listar_restaurantes():
    os.system('cls')
    imprimir_subtitulo('Listando novos restaurantes')
    for nomes in restaurantes:
        nome_do_restaurante = nomes['nome']
        categoria_do_restaurante = nomes['categoria']
        status_do_restaurante = nomes['ativo']
        print(f'{nome_do_restaurante} | {categoria_do_restaurante} | {status_do_restaurante}')
    voltar_ao_menu_principal()

def opcao_invalida():
    imprimir_subtitulo('opção invalida!')
    voltar_ao_menu_principal()



def escolher_opcoes():
    try:
        opcao_escolhida = int(input("Escolha uma opção\n"))
        print(f'Você escolheu a opção {opcao_escolhida}')
        
        match opcao_escolhida:
            case 1:
                cadastrar_restaurantes()
            case 2:
                listar_restaurantes()
            case 3:
                print("Ativando Restaurante")
            case 4:
                finalizar_app()
            case _:
                opcao_invalida()
    except:
            opcao_invalida()


''' oi né'''
def finalizar_app():
    os.system('cls')
    imprimir_subtitulo("Saindo do app")


''' if (opcao_escolhida == 1):
    print('Cadastrando restauerante')
elif(opcao_escolhida == 2):
    print("Listando restaurantes")
elif (opcao_escolhida == 3):
    print("Ativando Restaurante")
else:
    print("Saindo do app")
  '''  
def main():
    os.system('cls')
    exibir_nome()
    exibir_opcoes()
    escolher_opcoes()
    
if __name__ == '__main__':
    main()
1 resposta
solução!

O problema relatado parece estar relacionado à maneira como você está adicionando um novo restaurante na lista restaurantes. Ao adicionar um novo restaurante, você está criando uma lista contendo um dicionário, mas em vez de passar diretamente o dicionário para restaurantes.append(), você está envolvendo esse dicionário em outra lista. Isso está criando uma lista aninhada dentro da sua lista de restaurantes, o que pode estar causando confusão no restante do seu código.

Aqui está a seção que precisa ser corrigida:

def cadastrar_restaurantes():
    imprimir_subtitulo("Cadastrando novo restaurante\n")
    os.system('cls' if os.name == 'nt' else 'clear')  # Melhoria para funcionar em todos os sistemas operacionais
    nome_do_restaurante = input("Digite o nome do restaurante que deseja cadastrar:\n")
    categoria_do_restaurante = input(f'Digite a categoria do restaurante {nome_do_restaurante}:\n')
    dados_do_retaurante = {'nome': nome_do_restaurante, 'categoria': categoria_do_restaurante, 'ativo': False}  # Correção aqui
    restaurantes.append(dados_do_retaurante)
    print(restaurantes)
    print(f"Restaurante {nome_do_restaurante} cadastrado com sucesso")
    voltar_ao_menu_principal()

Nessa correção, dados_do_retaurante é um dicionário que é diretamente adicionado à lista restaurantes usando restaurantes.append(dados_do_retaurante). Isso deve resolver o problema de o novo restaurante não ser adicionado corretamente.

Quanto ao problema de "opção inválida" ser exibida quando se espera que o novo restaurante apareça, isso provavelmente se deve ao fato de que a lógica de seleção de opção (escolher_opcoes) não está conseguindo reconhecer corretamente as opções além da primeira. No entanto, pelo código fornecido, a função escolher_opcoes e o uso de match para o menu parecem estar configurados corretamente.

Se o problema persistir mesmo após a correção acima, pode ser que exista algum outro problema não relacionado diretamente ao código que você forneceu. Recomendo verificar se a chamada da função cadastrar_restaurantes e as outras opções do menu estão funcionando conforme esperado após essa correção.

Além disso, a função os.system('cls') foi substituída por os.system('cls' if os.name == 'nt' else 'clear') para garantir que a limpeza do terminal funcione tanto no Windows ('nt') quanto em sistemas baseados em Unix (como Linux e macOS), onde o comando é 'clear'.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade