Як створити графічний інтерфейс на основі терміналу?


50

Я хочу створити середовище на терміналі, щоб адаптувати мій Bash- скрипт. Я хочу, щоб це виглядало так:

Установка Debian


4
Подивіться dialog, що саме це, як видається, використовується.
DopeGhoti


Я думаю, що термінальний інтерфейс GUI - це TUI (який відрізняється від CLI).
UniversallyUniqueID

"tui" - це термін IIRC RH. whiptail> dialogтакож
Братчлі

@Bratchley: GDB також використовує tuiдля свого режиму розділене вікно (показує регістри, джерело та команди, layout regнаприклад, та tui reg vecпоказує векторні регістри у вікні регістру (не гнучким способом, щоб ця частина була не дуже корисною: /) IDK, якщо Redhat написав патч, який додав цю функцію, або навіть скільки їй років
Пітер Кордес

Відповіді:


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

введіть тут опис зображення

Відповідь користувача зберігається у вихідному коді, тому може бути надруковано як завжди: echo $?(зверніть увагу, що 0означає "так", а 1у світі оболонки - "ні").


Щодо інших питань із розділу коментарів:

  • щоб помістити в діалогове вікно вихід з якоїсь команди, просто використовуйте механізм заміни команд $(), наприклад:

     dialog --backtitle "$(echo abc)" --title "$(cat file)" ...
    
  • щоб дати користувачеві кілька варіантів, ви можете використовувати --menuопцію замість--yesno

  • для зберігання результатів вибору користувача у змінну потрібно використовувати --stdoutпараметр або змінити дескриптор виводу через --output-fdабо вручну, наприклад:

    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"
    

    Цей трюк потрібен, оскільки dialogза замовчуванням виводиться на stderr, а не на stdout.

І як завжди, man dialogваш друг.


ось прекрасний "Bla bla bla ...", але як ти захоплюєш результат?
tempforЗнайдіть мене в лісі

1
@tempforFindMeInTheWoods, якщо під виходом ви маєте на увазі код виходу, то так само, як і usuall: він зберігається всередині ?змінної, спробуйте echo $?.
jimmij

1
@tempforFindMeInTheWoods Якщо ви хочете представити результат команди parted -lкористувачеві за допомогою діалогового вікна, можливо --menu, кращий вибір замість цього -yesno. У такому випадку вам доведеться трохи пограти з дескрипторами, щоб зберегти вихід у змінну, наприклад: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
jimmij

3
Або ви можете скористатися --stdoutопцією.
Томас Дікі

2
Усі параметри діалогу пояснюються в посібнику:man dialog
Ferrybig

34

Скріншот у запитанні виглядає як whiptail (функціонально скорочена програма, що імітує діалог , використовуючи newt, а не ncurses ). Спосіб відображення заголовка та кнопок у кожній програмі, завдяки чому вони виглядають по-різному.

Ось сценарій, який дублює оригінальний скріншот, або для whiptail або для діалогу:

#!/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))

і для порівняння, скріншот із батогом:

скріншот з батогом

і з діалоговим вікном:

скріншот із діалоговим вікном

Крім різного вигляду заголовка та кнопок, діалогове вікно використовує різні кольори за замовчуванням (хоча це налаштовувати - див. Скріншоти ), і він використовує менше рядків на екрані.

У діалоговому вікні (і whiptail) використовувати бібліотеки для управління відображенням ліній, кольорів тощо. Але ви також можете побачити тритон, який використовується в програмі анаконда Red Hat як спільну бібліотеку, що називається python (з тим самим виглядом). По тому ж рядку програма конфігурації ядра запускалася як (скорочена) копія діалогового вікна, а потім перетворювалася на функції, використовуючи спільну бібліотеку (без оригінальної lxdialogпрограми), подібно до того, як newt використовується з python.

Від bash - ви можете використовувати діалоговий або whiptail для найбільш часто використовуваних функцій. Хтось написав обгортку для тих (в perl), щоб дозволити скриптам легше використовувати або ті, або кілька інших, але вам краще використовувати діалог безпосередньо, оскільки модуль perl по суті є загальним знаменником.

Джерела діалогу містять приклади всіх віджетів, а також більшість параметрів командного рядка:

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.

Подальше читання:


11

Я вважаю, що пакунок, який ви шукаєте, є нурсексом .

Вікіпедія описує нуклеуси наступним чином:

ncurses (нові прокльони) - бібліотека програмування, що забезпечує API, який дозволяє програмісту писати текстові інтерфейси користувача незалежно від терміналу. Це інструментарій для розробки прикладного програмного забезпечення, подібного до GUI, який працює під емулятором терміналу

Він широко використовується, наприклад, у інструменті конфігурації ядра menuconfig: Знімок екрана інструмента меню конфігурації ядра Linux

Оскільки ви використовуєте bash, ви можете використовувати Bash Simple Curses (як згадував Руніум у коментарі нижче).


11
ncursesє С-бібліотекою. (Якщо я правильно розумію) ОП хоче сценарій середовища (для баш). menuconfigнаписано в C. Як альтернатива dialog, як за іншою відповіддю, ви можете, можливо, згадати Bash Simple Curses, який написаний bash (спираючись на tput).
Руніум

@Runium: Дякую за роз’яснення та посилання на Bash Simple Curses.
Розташування

2
все ж, було б корисно згадати, що ncursesє основою цього, і він відповідає на більш загальну версію питання ... на кшталт тієї, яку вказано у назві тут :)
підкреслюю_

-1

завзятість

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)

zenity - словослов

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

zenity - файл-вибір

zenity --help

zenity --допомогти результат

zenity --help-general 

zenity - допоміжний загальний результат

zenity --help-entry

zenity - результат допомоги

інші графічні інтерфейси користувача (gui)

dialog

діалог

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

зупиняє подальше виконання сценарію Тхо, порушує його. рядок: echo $? , ніколи не відбудеться

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.