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
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")
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)
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]
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
Devemos criar o módulo app.py para servir ao nosso propósito
new-Item 'app.py' -ItemType File
Inserindo conteúdo python no módulo criado
Add-Content -Path .\app.py -Value 'print("Olá mundo")'
Para execução do programa abaixo, basta chamar o módulo app.py
python .\app.py
Olá mundo
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
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
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")
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
Não seja um escravo de sua própria mente programada pelo sistema
Top comments (0)