web-dev-qa-db-ja.com

端末ベースのGUIを作成するにはどうすればよいですか?

私は Bash スクリプトを適応させるターミナルベースの環境を作成したいと考えています。私はそれをこのように見せたいです:

Debian install

質問のスクリーンショットはホイップテール(- ncurses ではなくnewtを使用して 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))

比較のために、whiptailのスクリーンショット:

screenshot with whiptail

そしてダイアログ付き:

screenshot with dialog

タイトルとボタンの異なる外観に加えて、ダイアログはデフォルトで異なる色を使用します(ただし、これは構成可能です--- スクリーンショットを参照 )、画面上の行が少なくなります。

ダイアログ(およびwhiptail)は、線、色などの表示を管理するためにライブラリを使用します。ただし、Red Hat anacondaプログラムで使用されるnewtがpython(同じ外観)。同じように、カーネル構成プログラムはダイアログの(カットダウン)コピーとして開始され、その後、newtが使用されるのと同じように、共有ライブラリ(元のlxdialogプログラムなし)を使用して機能に進化しましたpython。

Bashから—最も一般的に使用される機能には、ダイアログまたはホイップテールを使用できます。誰かが それらの(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.

参考文献:

33
Thomas Dickey

あなたが探しているパッケージは ncurses だと思います。

Wikipedia は、ncursesを次のように説明します。

ncurses(新しいcurses)は、プログラマーがテキストベースのユーザーインターフェイスを端末に依存しない方法で記述できるようにするAPIを提供するプログラミングライブラリです。端末エミュレーターの下で実行される「GUIのような」アプリケーションソフトウェアを開発するためのツールキットです。

これは、たとえばmenuconfigカーネル構成ツールで広く使用されています。 Screen shot of Linux kernel menuconfig tool

Bashを使用しているため、 Bash Simple Curses を使用できます(以下のコメントでRuniumが言及しています)。

12
Thawn

zenity

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)

# 助けて

zenity --help

zenity --help result

zenity --help-general 

zenity --help-general result

zenity --help-entry

zenity --help-entry result

他のグラフィカルユーザーインターフェイス(gui)

dialog

dialog

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

スクリプトのそれ以上の実行を停止し、中断します。コマンドは$をエコーし​​ますか? 、決して起こらない

0
FireInTheSky