DEV Community

Cover image for Escreva seu próprio menu ATM em 🐍
Rodrigo_Mars
Rodrigo_Mars

Posted on

Escreva seu próprio menu ATM em 🐍

Este talvez seja um speedrun simples sobre como escrever menus em python usando comandos de entrada no terminal. Espero que este rascunho sirva como uma tela para que você possa esboçar idéias ou apenas uma leitura.
O código foi escrito em Python na versão 3.13.0 e executado no terminal PowerShell usando estilo de escrita funcional, talvez não haja problemas caso você escolha uma versão anterior do interpretador. Enfim vamos ao que interessa, porque o nome ATM ? A sigla ATM é um acrônimo técnico para Automated Teller Machine, máquinas que permitem realizar transações bancárias. Este tema foi escolhido como idéia para conceituar menus inteligentes simulando operações como uma calculadora ou qualquer outro processo que exija um script de comandos sendo executados no terminal, não estarei abordando aqui as limitações impostas para programas que exploram interfaces de linha de comando.

Obs: Este texto não foi coletado, submetido ou imposto a prompts de AI. Cabe o seu autor escolher a origem e motivação para o seu intelecto.

▶︎ •၊၊||၊|။|||| | Lorn - OUT OF THE FRAME

Antes de iniciar apresentação do código, devemos incorporar as Libs abaixo para execução das funcionalidades os.system(str) e anotações de tipo Callable, sim neste códido adota o Type Annotation como estilo de escrita permitindo um código mais organizado, coeso, legível e reduzindo possíveis erros de escrita.

from os import system
from typing import Callable

Enter fullscreen mode Exit fullscreen mode

A função not_ATM() é responsável pela montagem e execução do Menu, contendo toda a lógica e funcionalidades necessárias para sua execução.
Este programa deve ser simples, não precisamos evoluir para algo como criar módulos ou pacotes.

if __name__ == "__main__":

    not_ATM()

    system("cls||clear")
Enter fullscreen mode Exit fullscreen mode

Função menu, disponibiliza opções & comandos na tela do terminal

def menu() -> None:

    for i, item in enumerate(["\nInforme uma das opções:\n",
                                "1 - Task 1", "2 - Task 2",
                                "3 - Task 3", "4 - Sair\n"]):

        print(f"{'':.>5} {item}" if i > 0 else item)
Enter fullscreen mode Exit fullscreen mode

A função de get_message(int) retorna o texto da função input(str) usada para captura do teclado

def get_message(attempts: int):

    message = ["<! Opção inválida, tente novamente !>:...",
                "Opção selecionada:..."]

    return message[0] if attempts > 0 else message[1]

Enter fullscreen mode Exit fullscreen mode

Estas são as funcionalidade principais dentro da função not_ATM(), as demais funcões são complementos como as opções do menu. Abaixo segue um exemplo de execução do menu no terminal.

python .\app.py

Informe uma das opções:

..... 1 - Task 1
..... 2 - Task 2
..... 3 - Task 3
..... 4 - Sair

Opção selecionada:...1
Enter fullscreen mode Exit fullscreen mode

Devemos criar o módulo app.py para servir ao nosso propósito

new-Item 'app.py' -ItemType File
Enter fullscreen mode Exit fullscreen mode

Inserindo conteúdo python no módulo criado

Add-Content -Path .\app.py -Value 'print("Olá mundo")'
Enter fullscreen mode Exit fullscreen mode

Para execução do programa abaixo, basta chamar o módulo app.py

python .\app.py
Olá mundo
Enter fullscreen mode Exit fullscreen mode

Antes de inserir o código no módulo app.py, vamos analisar a estrutura do While(...):. Neste padrão os operadores morsa (:=) e unpacking (*) são usados para captura e filtro dos comandos enviados pelo teclado. Com o operador unpacking obtemos os comandos de saída da lista [*'qQeE'] e com o operador morça capturamos os camandos enviados pelo teclado dentro da expressão lógica do While.

attempts = 0

while (option := input(get_message(attempts))[-1:]) not in [*'qQeE']:

    system("cls||clear")

    menu()

    try:

        if (tasks[option]() == 'exit'):
            break

        print(f"{tasks[option]()}\n")

        attempts = 0

    except:

        if attempts >= 2:
            input("Você superou N tentativas, operação encerrada...")

            break

        attempts += 1

Enter fullscreen mode Exit fullscreen mode

A estrutura try/except é usada para captura das exceções quando o teclado envia uma opção chave não identificada. O dicionário tasks é responsável pela validação das chaves e havendo uma opção incorreta, a exceção notifica mensagem de Opção inválida, tente novamente.

try:

    if (tasks[option]() == 'exit'):
        break

    print(f"{tasks[option]()}\n")

    attempts = 0

except:

    if attempts >= 2:
        input("Você superou N tentativas, operação encerrada...")

        break

    attempts += 1
Enter fullscreen mode Exit fullscreen mode

Agora copie todo o conteúdo abaixo para o módulo app.py


from os import system
from typing import Callable


def not_ATM() -> None:

    def menu() -> None:

        for i, item in enumerate(["\nInforme uma das opções:\n",
                                  "1 - Task 1", "2 - Task 2",
                                  "3 - Task 3", "4 - Sair\n"]):

            print(f"{'':.>5} {item}" if i > 0 else item)

    def task_1() -> str:
        return "task_1"

    def task_2() -> str:
        return "task_2"

    def task_3() -> str:
        return "task_3"

    def out() -> str:
        return 'exit'

    tasks: dict[str, Callable[[], str]] = {
        "1": task_1, "2": task_2,
        "3": task_3, "4": out}

    menu()

    attempts = 0

    def get_message(attempts: int):

        message = ["<! Opção inválida, tente novamente !>:...",
                   "Opção selecionada:..."]

        return message[0] if attempts > 0 else message[1]

    while (option := input(get_message(attempts))[-1:]) not in [*'qQeE']:

        system("cls||clear")

        menu()

        try:

            if (tasks[option]() == 'exit'):
                break

            print(f"{tasks[option]()}\n")

            attempts = 0

        except:

            if attempts >= 2:
                input("Você superou N tentativas, operação encerrada...")

                break

            attempts += 1


if __name__ == "__main__":

    not_ATM()

    system("cls||clear")

Enter fullscreen mode Exit fullscreen mode

Aqui finalizamos com este conceito e lógica sobre menus, reserve um tempo para uma melhor análise e lembre-se, existem diferentes formas de escrita para construção de menus.
Para execução lance o comando abaixo.

python .\app.py
Enter fullscreen mode Exit fullscreen mode

Não seja um escravo de sua própria mente programada pelo sistema

Playwright CLI Flags Tutorial

5 Playwright CLI Flags That Will Transform Your Testing Workflow

  • 0:56 --last-failed
  • 2:34 --only-changed
  • 4:27 --repeat-each
  • 5:15 --forbid-only
  • 5:51 --ui --headed --workers 1

Learn how these powerful command-line options can save you time, strengthen your test suite, and streamline your Playwright testing experience. Click on any timestamp above to jump directly to that section in the tutorial!

Watch Full Video 📹️

Top comments (0)

👋 Kindness is contagious

DEV is better (more customized, reading settings like dark mode etc) when you're signed in!

Okay