Return from a sub menu to the main menu of a Python function

Asked

Viewed 1,287 times

1

I created a simple Python application for an agenda system with Sqlite3. There are 3 files in the main menu agenda.py the of contato.py and usuario.py who log in to the system.

In the file 'agenda.py' I log in the user calling the login function (connection, login, password) that is in the file 'user.py' that returns me the function menuContacts() that is in the file 'contacts.py', inside that menu option 6 is to exit returning to the login menu of the file 'agenda.py' that’s where I can’t return to that home screen

Below is the code I’m using.

Agenda py.

from usuario import *
from contatos import *
import getpass

print("\n\033[47m\033[31mConectando no banco...\033[0;0m\n")
conexao = sqlite3.connect("banco.sqlite")

print("\n--- Efetuar Login no Sistema ---\n")

usuario = input("Por favor, informe o usuário: ")

senha = getpass.getpass("Por favor, informe a senha: ")

login(conexao, usuario, senha)

print("\n\033[47m\033[31mFechando conexão com o banco...\033[0;0m\n")
conexao.close()

py.

from usuario import *

# --- Função para criar a tabela ----
def criar_tabela_contato(conexao):

    cursor = conexao.cursor()

    sql = """
        CREATE TABLE IF NOT EXISTS contato (
            nome text,
            fone text,
            email text,
            usuario integer
        );
    """

    cursor.execute(sql)

    conexao.commit()
# --------------------------------------------

#  --- Função para inserir o contato ---
def inserir_contato(conexao, nome, telefone, email, id):

    cursor = conexao.cursor()

    sql = """
        INSERT INTO contato VALUES(
            '{}',
            '{}',
            '{}',
             {}
        );
    """.format(nome, telefone, email, id)

    cursor.execute(sql)

    conexao.commit()
# --------------------------------------------

# --- Função para listar contatos ---
def listar_contato(conexao):

    cursor = conexao.cursor()

    sql = "SELECT rowid, * FROM contato ORDER BY nome;"

    cursor.execute(sql)

    contato = cursor.fetchall()

    print("\033[32mId Nome    Telefone     E-mail\033[0;0m\n")
    print("\033[32m== ======= ===========  ================\033[0;0m\n")
    for cont in contato:
        print("{}: {} - ({}) -".format(cont[0], cont[1], cont[2]), cont[3] )
# -----------------------------------------------------------

# --- Função para excluir contatos ---
def excluir_contato(conexao, id):

    cursor = conexao.cursor()

    sql = """
        DELETE FROM contato
        WHERE rowid = {};
    """.format(id)

    cursor.execute(sql)

    conexao.commit()
# ---------------------------------------------------------------

# --- Função para buscar contatos ---
def buscar_contato(conexao, nome):

    cursor = conexao.cursor()

    sql = "SELECT rowid, * FROM contato WHERE nome LIKE '%{}%';".format(nome)

    cursor.execute(sql)

    contato = cursor.fetchall()

    print("\033[32mId Nome    Telefone  E-mail\033[0;0m\n")
    print("\033[32m== ======= ========  ================\033[0;0m\n")
    for cont in contato:
        print( "{}: {} - ({}) -".format(cont[0], cont[1], cont[2]), cont[3] )
# ----------------------------------------------------------------

# --- Função para alterar contatos ---
def alterar_contato(conexao, nome, telefone, email, id):

    cursor = conexao.cursor()

    sql = "UPDATE contato SET nome = '{}', fone = '{}', email = '{}' WHERE rowid = {}".format(nome, telefone, email, id)

    cursor.execute(sql)

    conexao.commit()
# -----------------------------------------------------------------------------------------------------------------------

# ========== Menu Principal ==========
def menuContatos():
    print("\n\033[47m\033[31mConectando no banco...\033[0;0m\n")
    conexao = sqlite3.connect("banco.sqlite")

    opcao = 0
    while opcao != 6:
        print("""\033[32m
Em relação aos contatos do sistema, você deseja...

        1 - Inserir
        2 - Buscar
        3 - Listar
        4 - Alterar
        5 - Excluir
        6 - Retornar
\033[0;0m""")

        opcao = int(input("\033[32mInforme a opção desejada: \033[0;0m"))

        if opcao == 1:
            print("\n\033[47m\033[30m--- Digite os dados do contato ---\033[0;0m\n")

            while True:
                n = input("Nome: ")
                if n == "":
                    print("\n\033[47m\033[30mEspaço vazio! Digite um nome...\033[0;0m")
                else:
                    break

            while True:
                t = input("Telefone: ")
                if t == "":
                    print("\n\033[47m\033[30mEspaço vazio! Digite um telefone...\033[0;0m")
                else:
                    break

            while True:
                e = input("E-mail: ")
                if e == "":
                    print("\n\033[47m\033[30mEspaço vazio! Digite um endereço de e-mail...\033[0;0m")
                else:
                    break

            while True:
                i = int(input("Id: "))
                if i == "":
                    print("\n\033[47m\033[30mEspaço vazio! Digite um Id...\033[0;0m")
                else:
                    break

            print("\n\033[47m\033[30m--- Contato inserido com sucesso ---\033[0;0m\n")

            inserir_contato(conexao, n, t, e, i)

        elif opcao == 2:
            print("\n\033[47m\033[30m--- Buscar Registro ---\033[0;0m\n")

            nome = input("Digite o nome do contato: ")
            print("\n\033[47m\033[30m--- Registros Encontrados ---\033[0;0m\n")
            buscar_contato(conexao, nome)

        elif opcao == 3:
            print("\n\033[47m\033[30m--- Lista de contatos cadastrados ---\033[0;0m\n")
            listar_contato(conexao)

        elif opcao == 4:
            print("\n\033[47m\033[30m--- Alteraçao de Contatos ---\033[0;0m\n")

            n = input("Nome: ")
            t = input("Telefone: ")
            e = input("Email: ")
            i = int(input("Id: "))
            alterar_contato(conexao, n, t, e, i)
            print("\n\033[47m\033[30m--- Alteração realizada com sucesso ---\033[0;0m\n")

        elif opcao == 5:
            print("\n\033[47m\033[30m--- Exclusão de Registro ---\033[0;0m\n")

            id = input("Digite o ID para do contato para excluir: ")
            excluir_contato(conexao, id)
            print("\n\033[47m\033[30m--- Contato excluido com sucesso ---\033[0;0m")

        elif opcao == 6:
            print("\n\033[47m\033[30m--- Retornando para o Menu Agenda ----\033[0;0m\n")
            return login(conexao, usuario, senha)


    print("\n\033[47m\033[31mFechando conexão com o banco...\033[0;0m\n")
    conexao.close()

users.py

import sqlite3
from contatos import *

# ---  Funções do Programa ---

# --- Função 1: Criação da Tabela ---
def criar_tabela_usuario(conexao):

    cursor = conexao.cursor()

    sql = """
        CREATE TABLE IF NOT EXISTS usuario(
            nome text,
            login text,
            senha text
        );
    """

    cursor.execute(sql)
# ---------------------------------------------------

# --- Função 2: Inserir Usuário ---
def inserir_usuario(conexao, nome, login, senha):

    cursor = conexao.cursor()

    sql = """
        INSERT INTO usuario VALUES(
            '{}',
            '{}',
            '{}'
        );
    """.format(nome, login, senha)

    cursor.execute(sql)

    conexao.commit()
# ---------------------------------------------------

# --- Função 3: Listar Usuários ---
def listar_usuarios(conexao):

    cursor = conexao.cursor()

    sql = "SELECT rowid, * FROM usuario ORDER BY nome;"

    cursor.execute(sql)

    usuarios = cursor.fetchall()

    print("\033[34mId Nome    Login\n\033[0;0m")
    print("\033[34m== ======= =========\n\033[0;0m")
    for usr in usuarios:
        print( "{}: {} - ({})".format(usr[0], usr[1], usr[2]) )
# ---------------------------------------------------------------

# --- Função 4: Excluir Usuários ---
def excluir_usuario(conexao, id):

    cursor = conexao.cursor()

    sql = """
        DELETE FROM usuario
        WHERE rowid = {};
    """.format(id)

    cursor.execute(sql)

    conexao.commit()
# ---------------------------------------------------------------

# --- Função 5: Buscar Usuários ---
def buscar_usuario(conexao, nome ):

    cursor = conexao.cursor()

    sql = "SELECT rowid, * FROM usuario WHERE nome LIKE '%{}%';".format(nome)

    cursor.execute(sql)

    usuario = cursor.fetchall()

    print("\033[34mId Nome    Login\n\033[0;0m")
    print("\033[34m== ======= ========\n\033[0;0m")
    for usr in usuario:
        print( "{}: {} - ({})".format(usr[0], usr[1], usr[2]))
# -----------------------------------------------------------------

# --- Função 6: Alterar Contatos --
def alterar_usuario(conexao, nome, login, senha, id):

    cursor = conexao.cursor()

    sql = "UPDATE usuario SET nome = '{}', login = '{}', senha = '{}' WHERE rowid = {}".format(nome, login, senha, id)

    cursor.execute(sql)

    conexao.commit()

# ----------------------------------------------------------------------------------------------------------------

#  --- Função 7: Login Menu Principal ---
def login(conexao, login, senha):

    cursor = conexao.cursor()

    sql = "SELECT rowid, * FROM usuario WHERE login LIKE '{}' AND senha LIKE '{}';".format(login, senha)

    cursor.execute(sql)

    usuario = cursor.fetchall()

    if usuario:
        for usr in usuario:
            print( "\n--- Bem Vindo! ---\n\n--- {} ---\n".format(usr[1]))
            return menuContatos()
    else:
        print("\n--- Usuário inválido! ---\n")
        print("...Retornado para o Menu Agenda...\n")

# -----------------------------------------------------------------------------------------------------------------

# --- Menu Principal do Programa ---

def menuUsuario():
    print("\n\033[47m\033[31mConectando no banco...\033[0;0m\n")
    conexao = sqlite3.connect("banco.sqlite")

    opcao = 0
    while opcao != 6:
        print("""\033[34m
Em relação aos usuários do sistema, você deseja...

        1 - Inserir
        2 - Buscar
        3 - Listar
        4 - Alterar
        5 - Excluir
        6 - Voltar
\033[0;0m""")

        opcao = int(input("\033[34mOpção desejada: \033[0;0m"))

        if opcao == 1:
            print("\n\033[47m\033[30m\--- Digite os dados do usuário ---\033[0;0m\n")

            while True:
                n = input("Nome: ")
                if n == "":
                    print("\n\033[47m\033[30mEspaço vazio! Digite um nome...\033[0;0m\n")
                else:
                    break

            while True:
                l = input("Login: ")
                if l == "":
                    print("\n\033[47m\033[30mEspaço vazio! Digite um login...\033[0;0m\n")
                else:
                    break

            while True:
                s = input("Senha: ")
                if s == "":
                    print("\n\033[47m\033[30mEspaço vazio! Digite um senha...\033[0;0m\n")
                else:
                    break

            print("\n\033[47m\033[30m--- Contato inserido com sucesso ---\033[0;0m\n")

            inserir_usuario(conexao, n, l, s)

        elif opcao == 2:
            print("\n\033[47m\033[30m--- Buscar registro ---\033[0;0m\n")

            nome = input("Digite o nome do usuário para a busca: ")
            print("\n\033[47m\033[30m--- Registros Encontrados ---\033[0;0m\n")
            buscar_usuario(conexao, nome)

        elif opcao == 3:
            print("\n\033[47m\033[30m--- Lista de usuário cadastrados ---\033[0;0m\n")
            listar_usuarios(conexao)

        elif opcao == 4:
            print("\n\033[47m\033[30m--- Alteração de Usuários ---\033[0;0m\n")

            n = input("Nome: ")
            l = input("Login: ")
            s = input("Senha: ")
            i = input("Id: ")
            alterar_usuario(conexao, n, l, s, i)
            print("\n\033[47m\033[30m--- Alteração realizada com sucesso ---\033[0;0m\n")

        elif opcao == 5:
            print("\n\033[47m\033[30m--- Exclusão de registro ---\033[0;0m\n")

            id = input("Digite o ID para do contato para excluir: ")
            excluir_usuario(conexao, id)
            print("\n\033[47m\033[30m--- Usuário excluido com sucesso ---\033[0;0m\n")

        elif opcao == 6:
            print("\n\033[47m\033[30m--- Voltando ----\033[0;0m\n")
            break
    # Fechando a conexão (ligação) com o banco
    print("\n\033[47m\033[31mFechando conexão com o banco...\033[0;0m\n")
    conexao.close()
  • still missing put error, you spoke in question "I can’t return to this home screen" but doesn’t say what the problem is, what error is presenting or what is failing.

  • This is the error that appears: Traceback (Most recent call last): File "C: Users sum_4 Downloads Maycon - Atom Algoritimos agenda agenda.py", line 16, in <module> login(connection, user, password) File "C: Users sum_4 Downloads Maycon - Atom Algoritimos agenda usuario.py", line 116, in login Return menuContatos() File "C: Users sum_4 Downloads Maycon - Atom Algoritimos agenda contactos.py", line 187, in menuContatos Return login(connexion, user, password) Nameerror: name 'login' is not defined

  • I should ask the question... and not comment. I edited my answer

  • Okay, thank you! Now it’s working properly.

1 answer

0


The problem is that your main menu is not inside the while, but in the scope of the main module, so it does not repeat itself! after it finishes the program is over! Just indent it correctly.

I marked below with a _ the spaces I added, for you to see the area that was missing indent:

from usuario import *
from contatos import *
import getpass

# Menu Principal Agenda ---
print("\n\033[47m\033[31mConectando no banco...\033[0;0m\n")
conexao = sqlite3.connect("banco.sqlite")

opcao = 0
while opcao != 2:
    print("""--- Menu Agenda ---

    1 - Entrar
    2 - Sair
    """)

____opcao = int(input("Escolha uma das opções: "))
____if opcao == 1:
____    print("\n--- Efetuar Login no Sistema ---\n")
____    usuario = input("Por favor, informe o usuário: ")
____    senha = getpass.getpass("Por favor, informe a senha: ")
____    login(conexao, usuario, senha)
____elif opcao == 2:
____    print("\nFechando o programa....\n")
____    break

print("\n\033[47m\033[31mFechando conexão com o banco...\033[0;0m\n")
conexao.close()

EDIT:

In addition to making the above change, you must change line 187 of contatos.py, this line here:

return login(conexao, usuario, senha)

should stay just like this:

return

Was the function login() who called the function menuContatos()... then to return to the function login() simply step out of function menuContatos() with return, without calling the function login() again.

This will make the function login() finalize also and then the code execution flow will return to repeat the "Agenda Menu" through the while which I put in the first part of my reply, just above.

  • Yes, but the problem is in option 6 of the menuContacts function that should return to the Agenda Menu from the home screen of the agenda.py file with options 1 - Login and 2 - Exit. When I run option 6 this giving module error.

  • @Mayconwillianalvesdasilva what error are you presenting? Put the complete error with traceback in the question

  • I edited the question for better understanding, I believe it is easier to understand my doubt...

Browser other questions tagged

You are not signed in. Login or sign up in order to post.