Como eu crio uma GUI baseada em terminal?

46

Estou procurando criar um ambiente baseado em terminal para adaptar meu script Bash . Eu quero que seja assim:

    
por tempforFind Me In The Woods 26.05.2016 / 23:33

4 respostas

40
dialog --backtitle "Package configuration" \
       --title "Configuration sun-java-jre" \
       --yesno "\nBla bla bla...\n\nDo you accept?" 10 30

Arespostadousuárioéarmazenadanocódigodesaída,portanto,podeserimpressanormalmente:echo$?(observeque0significa"sim" e 1 é "não" no mundo da shell).

Com relação a outras perguntas da seção de comentários:

  • para colocar na caixa de diálogo a saída de algum comando, basta usar o mecanismo de substituição de comandos $() , por exemplo:

     dialog --backtitle "$(echo abc)" --title "$(cat file)" ...
    
  • para dar ao usuário várias opções, você pode usar a opção --menu em vez de --yesno

  • para armazenar a saída da escolha do usuário na variável um, é necessário usar a opção --stdout ou alterar o descritor de saída por meio de --output-fd ou manualmente, por exemplo:

    output=$(dialog --backtitle "Package configuration" \
                    --title "Configuration sun-java-jre" \
                    --menu "$(parted -l)" 15 40 4 1 "sda1" 2 "sda2" 3 "sda3" \
             3>&1 1>&2 2>&3 3>&-)
    echo "$output"
    

    Esse truque é necessário porque dialog , por padrão, é enviado para stderr, não stdout.

E como sempre, man dialog é seu amigo.

    
por 26.05.2016 / 23:49
34

A captura de tela na pergunta parece com whiptail (um programa funcionalmente reduzido que imita o diálogo , usando o newt em vez de ncurses ). A forma como o título e os botões são renderizados é incorporada em cada programa, tornando-os diferentes.

Aqui está um script que duplica a captura de tela original, para whiptail ou dialog:

#!/bin/sh
: ${DIALOG:=dialog}
case "$DIALOG" in
*dialog*)
        OPTS="$OPTS --cr-wrap"
        high=10
        ;;
*whiptail*)
        high=12
        ;;
esac
rows=$(stty size | cut -d' ' -f1)
[ -z "$rows" ] && rows=$high
[ $rows -gt $high ] && rows=$high
cols=$(stty size | cut -d' ' -f2)
$DIALOG --backtitle "Package configuration" \
       --title "Configuring sun-java6-jre" \
       $OPTS \
       --yesno '\nIn order to install this package, you must accept the license terms, the "Operating System Distributor License for Java" (DLJ), v1.1. Not accepting will cancel the installation.\n\nDo you accept the DLJ license terms?' $rows $((cols - 5))

e para comparação, captura de tela com o whiptail:

ecomdiálogo:

Alémdaaparênciadiferentedotítuloedosbotões,odiálogousacoresdiferentesporpadrão(emboraissosejaconfigurável— ver capturas de tela ) e usa menos linhas na tela.

dialog (e whiptail) usam bibliotecas para gerenciar a exibição de linhas, cores, etc. Mas você também pode ver o newt usado no programa Red Hat anaconda como uma biblioteca compartilhada chamada python (com o mesma aparência). Na mesma linha, o programa de configuração do kernel começou como uma cópia (cortada) da caixa de diálogo e evoluiu para recursos usando uma biblioteca compartilhada (sem o programa lxdialog original) muito parecido com a maneira como o newt é usado a partir do python. / p>

Do bash - você poderia usar qualquer um dos diálogos ou whiptail para os recursos mais usados. Alguém escreveu um invólucro para aqueles (em perl) para permitir que os scripts tenham mais facilmente use esses ou alguns outros, mas é melhor usar o diálogo diretamente, já que o módulo perl é essencialmente denominador comum.

As fontes de diálogo incluem exemplos de todos os widgets junto com a maioria das opções de linha de comando:

cdialog (ComeOn Dialog!) version 1.3-20160424
Copyright 2000-2015,2016 Thomas E. Dickey
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

* Display dialog boxes from shell scripts *

Usage: cdialog <options> { --and-widget <options> }
where options are "common" options, followed by "box" options

Special options:
  [--create-rc "file"]
Common options:
  [--ascii-lines] [--aspect <ratio>] [--backtitle <backtitle>] [--beep]
  [--beep-after] [--begin <y> <x>] [--cancel-label <str>] [--clear]
  [--colors] [--column-separator <str>] [--cr-wrap] [--date-format <str>]
  [--default-button <str>] [--default-item <str>] [--defaultno]
  [--exit-label <str>] [--extra-button] [--extra-label <str>]
  [--help-button] [--help-label <str>] [--help-status] [--help-tags]
  [--hfile <str>] [--hline <str>] [--ignore] [--input-fd <fd>]
  [--insecure] [--item-help] [--keep-tite] [--keep-window] [--last-key]
  [--max-input <n>] [--no-cancel] [--no-collapse] [--no-cr-wrap]
  [--no-items] [--no-kill] [--no-label <str>] [--no-lines] [--no-mouse]
  [--no-nl-expand] [--no-ok] [--no-shadow] [--no-tags] [--nook]
  [--ok-label <str>] [--output-fd <fd>] [--output-separator <str>]
  [--print-maxsize] [--print-size] [--print-version] [--quoted]
  [--scrollbar] [--separate-output] [--separate-widget <str>] [--shadow]
  [--single-quoted] [--size-err] [--sleep <secs>] [--stderr] [--stdout]
  [--tab-correct] [--tab-len <n>] [--time-format <str>] [--timeout <secs>]
  [--title <title>] [--trace <file>] [--trim] [--version] [--visit-items]
  [--week-start <str>] [--yes-label <str>]
Box options:
  --buildlist    <text> <height> <width> <list-height> <tag1> <item1> <status1>...
  --calendar     <text> <height> <width> <day> <month> <year>
  --checklist    <text> <height> <width> <list height> <tag1> <item1> <status1>...
  --dselect      <directory> <height> <width>
  --editbox      <file> <height> <width>
  --form         <text> <height> <width> <form height> <label1> <l_y1> <l_x1> <item1> <i_y1> <i_x1> <flen1> <ilen1>...
  --fselect      <filepath> <height> <width>
  --gauge        <text> <height> <width> [<percent>]
  --infobox      <text> <height> <width>
  --inputbox     <text> <height> <width> [<init>]
  --inputmenu    <text> <height> <width> <menu height> <tag1> <item1>...
  --menu         <text> <height> <width> <menu height> <tag1> <item1>...
  --mixedform    <text> <height> <width> <form height> <label1> <l_y1> <l_x1> <item1> <i_y1> <i_x1> <flen1> <ilen1> <itype>...
  --mixedgauge   <text> <height> <width> <percent> <tag1> <item1>...
  --msgbox       <text> <height> <width>
  --passwordbox  <text> <height> <width> [<init>]
  --passwordform <text> <height> <width> <form height> <label1> <l_y1> <l_x1> <item1> <i_y1> <i_x1> <flen1> <ilen1>...
  --pause        <text> <height> <width> <seconds>
  --prgbox       <text> <command> <height> <width>
  --programbox   <text> <height> <width>
  --progressbox  <text> <height> <width>
  --radiolist    <text> <height> <width> <list height> <tag1> <item1> <status1>...
  --rangebox     <text> <height> <width> <min-value> <max-value> <default-value>
  --tailbox      <file> <height> <width>
  --tailboxbg    <file> <height> <width>
  --textbox      <file> <height> <width>
  --timebox      <text> <height> <width> <hour> <minute> <second>
  --treeview     <text> <height> <width> <list-height> <tag1> <item1> <status1> <depth1>...
  --yesno        <text> <height> <width>

Auto-size with height and width = 0. Maximize with height and width = -1.
Global-auto-size if also menu_height/list_height = 0.

Leitura adicional:

por 27.05.2016 / 00:27
11

Eu acredito que o pacote que você está procurando é ncurses .

Wikipedia descreve as ncurses da seguinte forma:

ncurses (new curses) is a programming library providing an API that allows the programmer to write text-based user interfaces in a terminal-independent manner. It is a toolkit for developing "GUI-like" application software that runs under a terminal emulator

É amplamente utilizado, por exemplo, na ferramenta de configuração do kernel menuconfig:

Comovocêestáusandoobash,vocêpodeusar Bash Simple Curses (como mencionado por Runium no comentário abaixo).     

por 26.05.2016 / 23:51
-1

zenity

zenity --file-selection --directory

.

# var means variable

var\
=$(
zenity --entry                   \
       --title="title"           \
       --text="text"             \
       --entry-text="entry text" \ 
)                                \
&&
echo "$var"

.

# ls is a command to list files in a directory

ls $(zenity --file-selection --directory)

password=$(zenity--password)

file="$(zenity --file-selection)"

zenity--help

zenity --help-general 

zenity--help-entry

outras interfaces gráficas do usuário (gui)

dialog

dialog\--backtitle"backtitle"             \
 --title "title"                     \
 --yesno                             \
 "bla bla bla...\n\n Do you accept?" \
 0 -1                                
echo $?

pára a execução adicional do script tho, quebra-o. a linha: echo $? nunca acontecerá

    
por 21.10.2018 / 07:02