\

Aqui temos um livro livre e completo sobre Shell

Os sedentos do "saber livre" são muito benvindos.

Você está aqui: TWikiBar > BatePapos > TWikiBarZenity
Controles: EDITAR ANEXAR MAIS MAIS ALTERACOES IMPRIMIR - Última Atualização: [23 Mar 2010 - V.7]

Papo de Botequim 2.0 (um livro completo de ZENITY)


ALERT! Em Construção: Mas já dá para começar a estudar, mesmo faltando as figuras dos diálogos!



Papo de Botequim 2.0.1 (ZENITY 1a. parte)

Há alguns dias estava andando no calçadão e eis que encontro o Chico, o meu garçom preferido... Conversamos um pouco, quando contou-me que estava trabalhando, vejam só, no "Pinguim Carioca". Como já sou mesmo chegado a um boteco e muito mais a um pinguim, no primeiro sábado que passaria em casa, convidei um amigo para tomar um chope.

Lá chegando, logo após a primeira rodada de canecas, o amigo me fala na maior cara de pau:

    - Pô mermão (com sotaque carioca), você tem de se modernizar... Porque insistir em desenvolver programas com interfaces arcaicas orientadas a caractere? Porque você não parte para algo mais atual?

Fiquei indignado com aquilo e respondi:

    - Cara, você que tem de se modernizar e largar esta porcaria que você chama de sistema operacional e que lhe deixa na mão a toda hora, sem falar nos custos, vírus e nas telas azuis que você ganha pelo menos uma vez ao dia.

    A partir de hoje e nas próximas vezes que viermos aqui, vou lhe mostrar as interfaces gráfica que foram desenvolvidas para serem usadas diretamente do Shell e verá que são muito mais concisas e fáceis de usar que as que você conhece.

    É necessário no entanto, ter um bom conhecimento de Shell, o que você consegue nos Papos de Botequim que estão lá em http://www.julioneves.com

    - Chico, traz mais dois chopes! Você não esqueceu que o meu é sem colarinho, né?

    Agora, e nos nossos próximos encontros, vou lhe dar um curso sobre os programas que fazem interface gráfica para o Shell, começando pelo zenity, que é completo e extenso o suficiente para que este nosso papo se estique por mais uns três encontros.

Como tudo começou

Um dia, o Tujal me pediu para dar um acabamento legal em uns scripts que que ele desenvolveu para o CVS (Current Version System - ou seja, um gerenciador de fontes) e fui procurar na internet como fazê-lo usando o zenity, do qual já tinha ouvido falar muito bem.

Considero este software muito importante, pois dominando Shell e zenity, você poderá desenvolver seus scripts em Shell – que como você já viu (ou verá na página que passei) é uma linguagem simples e concisa – e dar-lhes um excelente acabamento gráfico com zenity.

O zenity é a cara do Shell, facílimo de usar e super conciso. Estas duas ferramentas se complementam, de forma a facilitar sua vida em programas curtíssimos e poderosos.

Afinal de contas, quem é esse cara?

zenity é um programa que se utiliza de ferramentas do GTK+ para produzir interfaces gráficas muito bem acabadas que atuarão entre scripts em Shell (e outras linguagem orientadas a caractere) e os usuários, provendo entre ambos uma correlação amigável e bonita.

O zenity é um executável, que recebe todos os parâmetros via linha de comando e retorna – no código de retorno ($?) e/ou na saída primária (stdout) a escolha do usuário. Isso permite apresentar, pedir e trocar informações com o operador. Por exemplo o comando zenity --question irá apresentar uma janela com uma pergunta e 2 botões (um de OK e outro de CANCEL). O código de retorno ($?) será 0 ou 1 dependendo se você clicou no OK ou CANCEL. O comando zenity -–entry pedirá uma entrada de dados e os mesmos 2 botões. Você obterá da mesma forma um código de retorno ($?) igual a 0 ou 1 e a saída primária (stdout) receberá o que foi digitado. Experimente!

Síntese das opções de diálogo

As principais opções de diálogo e suas descrições resumidas são as seguintes:

Opção Efeito
--scale Mostra um escala para opções
--calendar Mostra um calendário
--entry Mostra uma caixa para inserir textos
--error Mostra uma janela de erros
--file-selection Mostra uma janela para selecionar arquivos
--info Mostra uma janela com informações
--list Mostra uma caixa com lista
--notification Mostra uma janela de notificação
--progress Mostra uma barra de progresso
--question Mostra uma janela para fazer uma pergunta
--text-info Mostra uma janela de texto
--warning Mostra uma janela de advertência

A partir de agora esmiuçaremos todos os parâmetros aceitos em cada uma destas opções descritas. No entanto, alguns argumentos podem ser utilizados por qualquer uma das opções e é por eles que começaremos nossa aprendizagem.

Parâmetros genéricos

Opção Efeito
--height=ALTURA Define a altura das caixas
----title=TITULO Define um título para as caixas
--window-icon=ICONE Define um ícone para as caixas
--width=LARGURA Define a largura das caixas

--title
    Especifica o título que fica na borda superior da caixa.

--window-icon
    Permite alterar os ícone padrão (default) das caixas de diálogo.

--width
    Especifica em pixels a largura das caixas de diálogo.

--height
    Especifica em pixels a altura das caixas de diálogo.

Caixa de diálogo --calendar

Opção Efeito
--date-format=PATTERN Define formato da data (mesmo formato do date)
--day=INT Define o dia padrão (default)
--month=INT Define o mês inicial
--year=INT Define o ano inicial

O diálogo calendar serve para você escolher uma data. As opções --day, --month e --year, servem para você especificar respectivamente o dia padrão (default), o mês e o ano do calendário que será exibido. Veja este fragmento de script:

until data=$(zenity --calendar --title "Datas dos vôos" --text "Escolha uma data para o vôo de ida" --day $(date +%_d) --month $(date +%_m) --year $(date +%Y)) do : done echo $data 20-03-2010

Neste exemplo, me aproveitei da facilidade do botão CANCEL devolver um código de retorno ($?) diferente de zero para permanecer no loop do until, que não faz nada (comando :), porém só termina quando uma data for escolhida. O resultado da escolha foi para a variável $data.

  • Inserir widget calendar aqui

Widget Calendar

Neste exemplo não seria necessário informar os parâmetros --day, --month e --year, pois seus valores padrão (default) são os da data de hoje, e foram justamente estes os valores informados.

Pinguim com placa de dica

Vale ressaltar o uso dos caracteres sublinha (_) na formatação do dia e do mês. Caso não o puséssemos, os números gerados, se menores que 10, viriam precedidos de zero, e o zenity interpretaria isso como um octal, produzindo resultados indesejáveis.

Como você viu, a saída padrão (default) é no formato dd-mm-aaaa para alterar este formato podemos usar os mesmos caracteres de formatação do comando date. Experimente o seguinte:

zenity --calendar --date-format="%Y/%m/%d" 2008/07/19

  • Inserir outro widget calendar aqui

Widget Calendar

Caixa de diálogo --warning

Opção Efeito
--no-wrap Não permite quebra automática do texto
--text=TEXTO Define o texto da advertência

O diálogo de warning (atenção) serve para você fazer uma advertência ao operador. Vejamos um fragmento de programa que é melhor ser executado por um usuário root, pois terá restrições de uso para um usuário comum.

[ $UID -eq 0 ] || zenity --warning --title="Você não é root" --text="Você não terá acesso a todas as opções"

Na primeira linha, comparamos a variável do interna $UID, do operador, e comparamos com zero (qualquer usuário root tem UID=0). Caso seja diferente, um diálogo de atenção será disparado.

  • Inserir widget warnig aqui

Caixa de diálogo --question

Opção Efeito
--no-wrap Não permite quebra automática do texto
--text=TEXTO Define o texto da pergunta

O diálogo de pergunta (--question) irá lhe fazer uma pergunta e oferecer como resposta 2 botões: OK e CANCEL. Caso seja pressionado o OK, o código de retorno ($?) será igual a zero, caso contrário será diferente de zero.

Aproveitando isso, após o diálogo de advertência mostrado no exemplo anterior, poderíamos perguntar ao operador se ele deseja mudar para root. Para isso fazemos:

Resp=n zenity --question --title "Responda" --text "Deseja mudar para root?" && Resp=s

  • Inserir figura do dialogo question

E ao fim da execução a variável $Resp teria obrigatoriamente s ou n.

As man pages, por incrível que pareça, têm um exemplo bastante engraçado do uso desta opção. Veja:

  • Inserir figura do dialogo question do exemplo das man pages

Temos ainda o parâmetro --no-wrap que pode ser usado caso o texto definido por --text seja grande e você não queira dividi-lo em mais de uma linha.

Caixa de diálogo --entry

Opção Efeito
--hide-text Esconde o valor digitado (senhas)
--text=TEXTO Define o texto da caixa
--entry-text=TEXTO Valor padrão (default)

Esta opção abre uma janela de diálogo, requisitando uma entrada de dados ao operador. Vamos continuar nos exemplos em que o cara deveria ser root para aproveitar todas as facilidades oferecidas por um determinado aplicativo, mas primeiramente vamos pegar o exemplo anterior e inseri-lo neste contexto:

if zenity --question --title "Responda" --text "Deseja mudar para root?" then Senha=$(zenity --entry --title "Captura de Senha" --text "Informe a senha de root:" --hide-text) fi echo $Senha 123456

  • Inserir figura do diálogo question

O comando if testou o diálogo de pergunta e caso o botão clicado seja OK, o programa lançará a caixa de entrada de dados a seguir para capturar a senha. Repare que a opção --hide-text não deixa o texto que está sendo digitado aparecer na tela.

Poderíamos oferecer um valor padrão (default), para isso fazemos:

Usuário=$(zenity --entry --title "Captura nome de usuário" --text "Informe o nome do usuário na máquina remota:" --entry-text $LOGNAME)

  • Inserir caixa de diálogo com entry-text

    - Pois é, amigo, está gostando?

    - É por enquanto o negócio parece ser bom e conciso como você falou...

    - Então, de brincadeira, vamos desenvolver um "sistemeco" para nos lembrar dos aniversários dos amigos. Desta vez vou te deixar a incumbência de fazer um script para montar o arquivo de aniversariantes, que tem o lay-out a seguir:

Campo Data de Nascimento Nome Endereço de e-mail Telefone
Formato AAAAMMDD Xxxx Xxxx Usuário@dominio (DD) NNNN-NNNN

Repare que o campo Data de Nascimento é o primeiro e está no formato ano, mês, dia sem barras separadoras. Isso foi feito porque o arquivo deverá estar sempre ordenado por data e este formato facilita esta classificação. O separador entre os quatro campos será o dois-pontos (:) O script será feito em Shell, porém todas as interações com o usuários, isto é, leitura dos dados, avisos de erros e advertências, serão feitas via caixas de diálogo zenity.

    - Chico, fecha a conta que eu vou nessa, mas não demoro a voltar...


Pinguim com placa de atenção

Aulas de ZENITY ou SHELL mande um e-mail para o Julio Neves para informar-se.

-- JulioNeves - 20 Mar 2010


Licença Creative Commons - Atribuição e Não Comercial (CC) 2017 Pelos Frequentadores do Bar do Júlio Neves.
Todo o conteúdo desta página pode ser utilizado segundo os termos da Creative Commons License: Atribuição-UsoNãoComercial-PermanênciaDaLicença.