Piter Punk's HomePage - Artigos
 
English version
Usando o dialog

Piter PUNK

Muitas vezes, depois de fazer um programa em shell, você percebe que seria interessante produzir uma interface melhor com o seu usuário, usando menus, caixas de texto, etc... É nessa hora que surge o dialog!

1. Introdução

O dialog é um programa simples de usar que oferece a você vários recursos de "gráficos" para incrementar os seus shell scripts. Neste artigo iremos "mostrar" um pouco do dialog, mas ele não se resume apenas ao que escrevemos aqui. Ele possui muitas outras opções e funcionalidades, que poderão ser melhor exploradas após uma boa olhada no manual.

2. Começando

A estrutura de um comando no dialog é bem simples:

	dialog --tipo-de-caixa "Texto da caixa" 

Dependendo do tipo-de-caixa, são necessárias várias outras opções. Vamos brincar com uma --msgbox, onde você pode colocar informações do seu programa antes de executá-lo...

	dialog --msgbox "\
	Este é um programa muito bem feito \
	e especial, e depois de clicar em \
	OK você entrará no maravilhoso mundo \
	do meu programa wonder-ultra-plus" 0 0

Irá aparecer uma caixa centralizada contendo o texto que você digitou e um botão de OK. O "0 0" do fim diz para o dialog autodimensionar a janela, mas você pode força-lo a usar o tamanho que quiser trocando os números, o primeiro é a altura e o segundo a largura da caixa.

3. Incrementando

Vamos agora melhorar um pouco mais a aparência da nossa caixa de mensagens, vamos colocar um título na caixa:

	dialog --title "Apresentação" --msgbox "\ 
	Este é um programa muito bem feito \
	e especial, e depois de clicar em \
	OK você entrará no maravilhoso mundo \
	do meu programa wonder-ultra-plus" 0 0

Já ficou melhor não é? Agora, para ficar com um visual ainda mais profissional vamos colocar um título no fundo, com o nome do nosso programa:

	dialog --backtitle "MeuPrograma 0.1" --title "Apresentação" ...

Onde estão os ... é para colocar o resto do texto dos exemplos anteriores. Ah! Estas opções --backtitle e --title funcionam em todas as outras caixas do dialog.

4. Outras caixas

Agora que já estamos craques em desenhar caixas de mensagem e em um design legal, vamos dar uma verificada nas outras caixas que o dialog nos oferece:

4.1. Sim/Não

Para perguntas simples, nada como a caixa --yesno, onde você coloca uma mensagem e o usuário responde com "sim" ou "não". Por exemplo:

	dialog --yesno "Você deseja apagar tudo?" 0 0

Um detalhe bem interessante, é saber o que o seu usuário respondeu, no caso do -yesno, ele devolve "0" para sim (sucesso) e "1" para não (fracasso). O nosso programinha ficaria assim:

	dialog --yesno "Você deseja apagar tudo?" 0 0
	if [ $? = 0 ]; then
		dialog --infobox "Apagando tudo..." 0 0
	else
		dialog --infobox "A vida continua..." 0 0
	fi

Com isso aprendemos a pegar os resultados do --yesno e de quebra aprendemos a usar uma --infobox -;)

4.2. Menu

Este tipo de caixa vai apresentar um menu (!!!). Ele é um pouco mais complicado que os outros que vimos até agora, tem muito mais parâmetros:

	dialog --menu "Selecione uma opção do menu" 0 0 3 \
	1 "Opção 1" \
	2 "Opção 2" \
	3 "Opção 3"

A primeira alteração visível, é que o tamanho possui 3 argumentos ao invés de dois, os dois primeiros são altura e largura, e o último é o tamanho da "lista" de opções.

Se você colocar o tamanho da lista menor que a quantidade de opções, você poderá "rolar" pelas opções (irá aparecer um indicador "v(+)" ou "^(+)" indicando que existem mais opções abaixo ou acima

Outra alteração são as próprias opções! Você pode colocar um "atalho" e depois o texto da opção.

Para pegar a saída do "OK" e do "Cancel", use o mesmo processo que utilizamos para pegar a saída do --yesno, "0" para OK e "1" para "Cancel"

E, para pegar a opção selecionada, existem duas opções:

  • usar um arquivo temporário com a opção e depois ler do arquivo o que o usuário escolheu
  • Passar a saída diretamente para uma variável

Para fazer o primeiro, é bem simples... apenas coloque no final do comando dialog um 2>/tmp/arquivotemporario, como abaixo:

	dialog --menu "Selecione uma opção do menu" 0 0 3 \
	...
	3 "Opção 3" 2>/tmp/arquivotemporario

Este método é fácil mas é um pouco desagradável depender de um arquivo externo. É preferível utilizar a segunda opção:

	OPCAO=`dialog --stdout --menu "Selecione uma opção...\
	...
	3 "Opção 3"`

Logo depois de executar o dialog, a saída dele estará na variável OPCAO, bem mais prático.

4.3. Radiolist

Podemos dizer que este é um "modelo" diferente de Menu, serão apresentadas várias opções para você selecionar, e apenas uma delas pode estar selecionada:

	dialog --radiolist "Selecione uma opção do menu" 0 0 3 \
	1 "Opção 1" ON \
	2 "Opção 2" OFF \
	3 "Opção 3" OFF

Lembre que apenas uma das opções pode estar ativa, repare que também já deixamos uma opção selecionada "por default"

Para pegar a opção selecionada, basta utilizar os métodos que vimos na caixa de Menu.

4.4. Checklist

Esta é uma parente da Radiolist, a grande diferença é que podemos selecionar mais de uma opção:

	dialog --checklist "O que pretende apagar?" 0 40 3 \
	usuarios "Todos os usuários" ON \
	programas "Todos os programas" ON \
	tudo "Tudo mesmo..." OFF

A saída desta caixa é o nome das várias opções selecionadas, cada uma delas entre aspas. Isso atrapalha um pouco para trabalhar com essas opções. Uma boa idéia é utilizar o --separate-output isso fará com que a saída seja dada uma opção por linha.

4.5. InputBox

Este é o tipo de caixa que você vai escolher quando for pedir para o seu usuário escrever algo. Para coletar o que o seu usuário digitou, utilize os métodos que já vimos em outros exemplos:

	dialog --inputbox "Escreva aqui alguma bobagem" 0 0

4.6. Mais Caixas

Mostrei apenas as Caixas que acho mais úteis, mas existem várias outras à mais se você quiser:

--calendar Mostra um calendário para você selecionar a data
--fselect Uma caixa de seleção de arquivos
--gauge caixa para ver o andamento (em porcentagem) de algo
--textbox Mostra o conteúdo de um arquivo texto
--timebox Para você selecionar as horas
--inputmenu Igual ao menu, mas você pode alterar as opções, muito bom para corrigir algumas entradas

E além destas ainda existem outras, dê aquela olhadinha na saída do comando dialog sem argumentos e na manpage dele.

5. Conclusão

O dialog é uma ferramenta poderosa para o desenho de interfaces com o usuário e ainda tem uma vantagem adicional, existem vários clones dele para o modo gráfico, como o Xdialog ou o gdialog e normalmente eles seguem a mesma sintaxe do dialog. Seus scripts agora com janelinhas, quem diria -;)

Talvez o único "contra" do dialog seja as suas linhas de comando enormes, mas sabendo usar corretamente o \ para quebrá-las em pedacinhos ele se torna perfeitamente gerenciável.

Qualquer dúvida, crítica ou sugestão sobre este artigo: piterpk@terra.com.br


Links Principal Artigos Piter Punk Dicas Programas
 
Powered by Slackware Linux - Written in VIm (the best one!) Last Update: 30 Oct 2004