web-dev-qa-db-fra.com

Comment créer une interface graphique basée sur un terminal?

Je cherche à créer un environnement basé sur un terminal pour y adapter mon script Bash . Je veux que ça ressemble à ceci:

Debian install

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

enter image description here

La réponse de l'utilisateur est stockée dans le code de sortie, elle peut donc être imprimée comme d'habitude: echo $? (Notez que 0 Signifie "oui" et 1 Est "non" dans le Monde de Shell).


Concernant les autres questions de la section des commentaires:

  • pour mettre dans la boîte de dialogue la sortie d'une commande, utilisez simplement le mécanisme de substitution de commande $(), par exemple:

     dialog --backtitle "$(echo abc)" --title "$(cat file)" ...
    
  • pour donner à l'utilisateur plusieurs choix, vous pouvez utiliser l'option --menu au lieu de --yesno

  • pour stocker la sortie du choix de l'utilisateur dans la variable, il faut utiliser l'option --stdout ou changer le descripteur de sortie soit via --output-fd soit manuellement, par exemple:

    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"
    

    Cette astuce est nécessaire car dialog par défaut renvoie à stderr, pas à stdout.

Et comme toujours, man dialog Est votre ami.

45
jimmij

La capture d'écran de la question ressemble à whiptail (un programme fonctionnellement réduit imitant dialogue , utilisant newt plutôt que ncurses ). La façon dont le titre et les boutons sont rendus est intégrée dans chaque programme, ce qui les rend différents.

Voici un script qui duplique la capture d'écran d'origine, pour 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))

et pour comparaison, capture d'écran avec whiptail:

screenshot with whiptail

et avec dialogue:

screenshot with dialog

Outre l'apparence différente du titre et des boutons, la boîte de dialogue utilise différentes couleurs par défaut (bien que cela soit configurable — voir les captures d'écran ), et elle utilise moins de lignes à l'écran.

dialog (et whiptail) utilisent des bibliothèques pour gérer l'affichage des lignes, des couleurs, etc. Mais vous pouvez également voir newt utilisé dans le programme Red Hat anaconda comme une bibliothèque partagée appelée depuis python (avec la même apparence). Dans le même esprit, le programme de configuration du noyau a commencé comme une copie (abrégée) de la boîte de dialogue, puis a évolué vers des fonctionnalités utilisant une bibliothèque partagée (sans le programme lxdialog d'origine) un peu comme la façon dont newt est utilisé depuis python.

Depuis bash - vous pouvez utiliser la boîte de dialogue ou le whiptail pour les fonctionnalités les plus couramment utilisées. Quelqu'un a écrit un wrapper pour ceux-ci (en Perl) pour permettre aux scripts d'utiliser plus facilement ceux-ci ou quelques autres, mais il vaut mieux utiliser directement la boîte de dialogue car le module Perl est essentiellement un dénominateur commun.

Les sources de dialogue incluent des exemples de tous les widgets ainsi que la plupart des options de ligne de commande:

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.

Lectures complémentaires:

33
Thomas Dickey

Je crois que le package que vous recherchez est ncurses .

Wikipedia décrit ncurses comme suit:

ncurses (new curses) est une bibliothèque de programmation fournissant une API qui permet au programmeur d'écrire des interfaces utilisateur basées sur du texte d'une manière indépendante du terminal. Il s'agit d'une boîte à outils pour développer un logiciel d'application "de type GUI" qui fonctionne sous un émulateur de terminal

Il est largement utilisé, par exemple, dans l'outil de configuration du noyau menuconfig: Screen shot of Linux kernel menuconfig tool

Puisque vous utilisez bash, vous pouvez utiliser Bash Simple Curses (comme mentionné par Runium dans le commentaire ci-dessous).

12
Thawn

zénité

zenity --file-selection --directory

.

# var means variable

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

zenity dialog entry with options

password=$(zenity --password)

zenity --password

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

zenity --file-selection

# ls is a command to list files in a directory

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

# Aidez-moi

zenity --help

zenity --help result

zenity --help-general 

zenity --help-general result

zenity --help-entry

zenity --help-entry result

autres interfaces utilisateur graphiques (gui)

dialog

dialog

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

arrête l'exécution du script, l'interrompt. la commande echo $? , ne se produira jamais

0
FireInTheSky