Gerador Menu 1.0 Sobre este pacote Sistema gerador de menu para prompt de comando. 1.1 Sobre AVISO: A biblioteca só funciona corretamente com as versões 2.6 ou superiores ou 3.0 ou superiores. Resumidamente, este pacote python facilita a criação de menus para prompt de comando. Você já deve ter se enrolado com vários ifs, loops recursivos e breaks, ao criar menu para seus testes rápidos, organização dos seus programas, ou até mesmo em um programa profissional. O intuito deste pacote facilitar esta parte do seu código, escrevendo poucas linhas e fazendo o necessário. O core do Menu utiliza os seguintes módulos tanto para aumentar sua personalização, quanto para funcionar corretamente. Estes módulos talvez sejam úteis a você: colorirterminal: Colorir os textos no terminal; deterctarteclado: Captura de teclas. Bastante útil quando seu programa é multiplataforma e multi-versão do Python; i18n: Facilitar a internacionalização do código; procedimentos: Alguns procedimentos soltos (que não se encaixaram em nenhuma categoria acima) interessantes. Mais detalhes destes módulos serão abordados mais adiante. 1.2 Características Resumidamente, suas características e sua filosofia são: Multiplataforma - Windows e Sistemas Baseados em Unix Fácil utilização Exportável para XML Visual customizável
Tratamento de erros (implementando) Internacionalização do código Customização: Texto colorido 1.3 Para próximas versões Opções com numeração definida pelo programador Integração com outras linguagens (Testar) Copiar em um arquivo a documentação. Tanto da biblioteca com de suas subbibliotecas. (isso que você está lendo) 2.0 Sobre este documento A intenção deste documento é do mesmo ser um guia completo sobre o pacote aqui abordado. Por isto, possivelmente a leitura na íntegra pode ser cansativa. Então, você pode clicar aqui e pular para o índice de exemplos deste documento. 3.0 Instalando Para instalar, copie a pasta menu para o diretório padrão de pacotes terceirizados da sua versão Python (PythonXX/Lib/site-packages/). Porém, não é necessário a instalação para o uso do pacote. Você pode optar para colocar em um diretório de preferência do seu programa e importa-lo como se fosse um arquivo.py criado por você. 4.0 Criação de um menu A criação de um menu consiste nos seguintes passos: Importação do pacote Atribuição do menu Configuração do menu Gerenciamento de itens e submenus Chamada de execução
Seu programa não necessariamente deverá possuir esta ordem, esta ordem é só uma tentativa de agrupamento dos passos. O aprofundamento destes tópicos será citado mais abaixo 4.1 Meu primeiro menu Para didatizar o aprendizado, podemos fazer um menu com os seguintes passos: Importação do pacote Atribuição do menu Adição de itens Chamada de execução Vamos ao exemplo: # Importação do pacote from menu import Menu # Atribuição do menu menu = Menu("Menu Principal") # Adição de itens menu.adicionaritem([], "Item", print, "Você selecionou a opção 1") menu.adicionaritem([], "Item", print, "Você selecionou a opção 2") menu.adicionaritem([], "Sair", quit) # Chamada de execução menu.executar() 4.2 Importação do pacote Para utilizar o pacote, importe-o: from menu import Menu
4.3 Atribuição do menu Crie uma instância da classe da seguinte forma: menu = Menu("Título do meu menu") 4.4 Configuração do menu Os atributos config e cores são os responsáveis pelas configurações do menu. Altere-os para que o menu se adapte da melhor forma à sua necessidade menu.config["menucaractere"] = "-" menu.config["menutambarra"] = 63 Lembre-se que as configurações serão herdadas pelos submenus (elementos menus filhos) criados após a manipulação das configurações do menu. 4.5 Gerenciamento de itens e submenus Os menus podem ter dois tipos de elementos filhos: Elementos menus (submenus): Elementos que chamarão outras classes Menu. Elementos itens: Elementos que chamarão procedimentos. Os métodos para criação são: Menu.adicionarSubMenu: Para adicionar um elemento menu Menu.adicionarItem: Para adicionar um elemento item E para remoção: Menu.remover: Remove tanto elemento menu quanto elemento item. menu.adicionaritem([], "Rótulo do elemento item", print, "Este é o primeiro elemento do menu") menu.adicionarsubmenu([], "Rótulo do elemento menu")) menu.adicionaritem([1], "Rótulo do elemento item", print, "Este é o primeiro elemento do menu")
# Lembre-se sempre de adicionar um item para retornar ao menu anterior menu.adicionaritem([1], "Retornar ao menu principal", "retornar") # E um para encerrar o menu principal: menu.adicionaritem([], "Sair", quit) # Para encerrar o programa menu.adicionaritem([], "Sair", "retornar") # Na raiz: Para encerrar o loop principal e continuar seu programa (Para futuras versões) Atualmente não existe uma maneira prática de alterar a ordem dos elementos de um menu e nem a alteração dos seus dados. Mas existem truques para isto manipulando-os direto na lista que armazena as informações do menu (Veja a sessão 6.3 Core). 4.6 Chamada de execução Para iniciar o loop principal do menu, chame o método executar. menu.executar() 5.0 Métodos 5.1 Métodos padrões: Menu(titulo="Título", menuanterior=none, coreslib="personalizado") ou Menu. init () Desc: Método iniciador titulo = Str: Rótulo do título menuanterior = Menu: Menu anterior coreslib = Str: Conjunto de cores que serão usadas no menu 'colorido' ou 'personalizado' Menu. repr () Desc: Retorna para impressão os seguintes dados da classe: Título, título do menu pai, total de elementos, total de elementos menus, total de elementos itens.
Exemplo: print(meumenu) Menu. len () Desc: Retorna: Número de elementos do menu Exemplo: len(meumenu) 5.2 Métodos de execução: Menu.iniciar() Desc: Faz nada Menu.executar() Desc: Executa o menu, iniciando o loop principal 5.3 Informações do menu Menu.eMenu(elemento=None, caminho=none) Desc: Verifica se o 'elemento' (dado o mesmo ou o 'caminho') é um objeto da classe Menu elemento = Mixed: Elemento a ser verificado caminho = List: Caminho do 'elemento' a ser verificado return = Bool: É um menu? Erros: Este método gera um MenuError caso tenha especificado um 'caminho' inválido.
5.4 Métodos de incremento: Menu.adicionarSubMenu(caminho, rotulo) Desc: Adiciona um elemento menu (submenu) a um menu. Submenu herda as self.config do pai caminho = List: []: Raiz rotulo = Str: Rótulo do item do menu Erros: Este método gera um MenuError caso você tente adicionar um submenu a um elemento item. Menu.adicionarItem(caminho, rotulo, funcao, *arg): Desc: Adicionar item a um menu caminho = List: []: Raiz rotulo = Str: Rótulo do item do menu funcao = Str: Nome da função arg = Argumentos da funcao Erros: Este método gera um MenuError caso você tente adicionar um item a um elemento item. 5.5 Métodos de decremento Menu.remover(caminho, elemento): Desc: Remove um 'elemento' (seja um item ou submenu) a partir do 'caminho' especificado. caminho = List: Caminho no qual o 'elemento' se encontra []: Raiz elemento = Int: Número de índice do item = Str: Rótulo do item return = Bool: False, caso não exista tal 'item' no 'caminho' especificado True, caso tenha removido com sucesso
Erros: Este método pode gerar dois erros, caso: Especifique um 'caminho' inválido O 'caminho' dado aponta para um item, e não para o submenu. Lembre-se de que o 'caminho' é o submenu na qual o 'elemento' a ser deletado se encontra 5.6 Armazenamento: Salvar Menu.salvar(endereco): Desc: Gera e salva o xml no 'endereco' endereco = str: Endereço do arquivo xml Menu.carregar(endereco): Desc: Carrega o menu salvo em xml no 'endereco' endereco = str: Endereço do arquivo xml retorno = Boolean: True caso o carregamento tenha sido um sucesso 6.0 Atributos 6.1 Configurações dict Menu.config Desc: Dicionário contendo as configurações do menu. Suas chaves são: versão = Str: Versão atual do sistema limpartela = Bool: Você deseja limpar a tela? Padrão: True ondeestou = Bool: Deseja exibir o onde estou? Padrão: True menucaractere: Str: Caractere que circunda o rótulo do menu. Padrão: "*" menutambarra: Int: Total de caracteres da barra que circunda o rótulo do menu. Padrão: 30 detectartecla: Str: "manual", caso precise pressionar Enter para identificar a opção selecionada. Padrão no Linux e no Windows "automatico", caso queira que identifique a tecla assim que a mesma for pressionada. Padrão em outros OS
dict Menu.cores Desc: Contém as cores escolhidas para coloração do menu libatual: Cor qu <------------------------------------------------------=================== 6.2 Informações do menu (TITULO 2) int Menu.numElem Desc: Retorna o total de elementos do menu Obs: Faz o mesmo que Menu. len () int Menu.numElemMenu Desc: Retorna o total de elementos menus (SubMenus) int Menu.numElemItem Desc: Retorna o total de elementos itens str Menu.nome GET - Desc: Retorna o nome do menu SET - Desc: Altera o nome do menu list Menu.itens GET - Desc: Retorna os itens do menu SET - Desc: Faz nada. Pressupôe-se que a pessoa queira desconfigurar os menus menu.itens é imutável
6.3 Core list Menu.menu Desc: Estrutura do menu. Lista contendo a estrutura do menu e seus filhos Como dito no tópico 4.5, existem dois tipos de elementos: menus e itens. Sendo que cada uma delas possuem uma estrutura própria: 1. Elemento menu: o idtipoelemento: Número contendo a id do tipo de elemento: 0 - Menu, 1 - Item o rótulo: Nome do elemento. listadefilhos: Lista contendo os filhos do menu 1. Elemento item: o idtipoelemento: Número contendo a id do tipo de elemento: 0 - Menu, 1 - Item o o rótulo: Nome do elemento. procedimento: Procedimento que será chamado quando o item for selecionado tupladeparamentros: Tupla contendo os parâmetros dados na criação deste elemento. Obs¹: Em um futura versão o idtipoelemento será substituido por charidelem, onde charidelem será um char que será usado para chamar seu submenu ou procedimento. Obs²: Alterando idtipoelemento, você não alterará o tipo de elemento. Um elemento menu é, sobretudo uma classe, enquanto um elemento item é uma lista com as seguintes características citadas acima. Acesso aos elementos filhos de um menu Aprender a ter acesso de forma correta aos elementos filhos vai te propiciar a ter um controle mais avançado do menu, podendo usufruir de melhor forma da classe Menu, suprindo suas necessidades que os métodos padrões da classe não resolvem, como a alteração de ordem dos elementos e a alteração das informações dos elementos.
Como espero que tenha percebido, os elementos pertencentes a uma classe Menu se encontram em uma lista que está na 3 posição do seu atributo menu. Vejamos o exemplo: menu = Menu("Comestíveis") menu.adicionarsubmenu([], "Frutas") menu.adicionarsubmenu([], "Legumes") menu.adicionaritem([], "Sobre o programa 'Comestíveis'", print, "Este é um menu exemplo ;D") menu.adicionaritem([], "Sair", quit) menu.adicionaritem([0], "Maçã", print, "Eu gosto de maçã") menu.adicionaritem([0], "Pêra", print, "Sua cor é verde quando não está madura") menu.adicionaritem([0], "Uva", print, "Suco de uva é gostoso!") menu.adicionaritem([0], "Retornar ao menu anterior", "retornar") menu.adicionaritem([1], "Beterraba", print, "Você gosta de suco de beterraba?") menu.adicionaritem([1], "Batata", print, "Elma chips!") menu.adicionaritem([1], "Cenoura", print, ":B") menu.adicionaritem([1], "Retornar ao menu anterior", "retornar") Agora vamos aprender a ter acesso: # O caso 1 é diferente do caso 2, pois o 1 é imutável # Caso 1 - Para visualizarmos itens do menu principal print(menu.itens) # Caso 2 - Ou até: print(menu.menu[2]) # O caso 3 e 4 é para ter acesso dos dados # Caso 3 - Em um elemento item # Agora tenhamos o controle do 3 item da classe Menu (Sobre o programa 'Comestíveis') print(menu.menu[2][2]) # Ele retornará a lista do elemento item: # [1, "Sobre o programa 'Comestíveis'", <built-in function print>, ('Este é um menu exemplo ;D',)]
# Caso 4 - Em um elemento menu print(menu.menu[2][0]) # Ele retornará uma classe Menu (e vai printar conforme abaixo devido ao método repr (): ''' Menu: Frutas Descrição: Menu anterior: Comestíveis Total Elements: 4 Menu elements: 0 Items elements: 4 ''' # Agora, caso queira mecher com um item do menu... # Vamos ter acesso ao 2 item (Batata) do 2 Menu (Legumes) do menu principal: meusubmenu = menu.menu[2][1] print(meusubmenu.menu[2][1]) # [1, 'Batata', <built-in function print>, ('Elma chips!',)] # Obs: No exemplo acima, a variável meusubmenu aponta para o filho do menu, consequentemente, as alterações feitas em meusubmenu serão logicamente feitas no filho do menu. Alterando ordem dos elementos Utilizaremos também neste tópico o exemplo do tópico anterior como base no nosso estudo. menu. Vejamos um exemplo no seguinte menu Alterando as informações dos elementos Utilizaremos também neste tópico o exemplo do tópico anterior como base no nosso estudo. # Com um elemento menu filho: # Instancie meusubmenu = menu.menu[2][1]
# Altere meusubmenu.nome = "Macarronada" meusubmenu.config["menucaractere"] = "x" meusubmenu.config["menutambarra"] = 50 # Com um elemento item filho: # Instancie menufrutas = menu.menu[2][0] itemuva = menufrutas.menu[2][2] # Altere itemuva[1] = " Vinho :D" # Você pode fazer direto também, mas é fácil se perder em itens muito profundos... menu.menu[2][0].menu[2][2][1] = "Laranja" 7.0 Índice de exemplos