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


50

Bashスクリプトを適応させるための端末ベースの環境を作成したいと考えています。私はそれがこのように見えることを望みます:

Debianインストール


4
を見てくださいdialog。これは、これが使用しているように見えるものです。
-DopeGhoti


端末ベースのGUIはTUI(CLIとは異なる)だと思います。
UniversallyUniqueID

「tui」はRH用語IIRCです。whiptail> dialogまた、
Bratchley

@Bratchley:GDBはtui、スプリットウィンドウモードにも使用しますlayout regたとえば、レジスタ、ソース、およびコマンドtui reg vecを表示し、regウィンドウにベクトルレジスタを表示します(柔軟性のない方法で、その部分はあまり役に立ちません:/) 。Redhatがその機能を追加したパッチを作成した場合はIDK、またはそれがどのくらい古いのか
Peter Cordes

回答:


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デフォルトではstdoutではなくstderrに出力されるため、このトリックが必要です。

そしていつものように、man dialogあなたの友人です。


それは美しい「Bla bla bla ...」ですが、どのように出力をキャプチャしますか?
tempforFindミーザ・ウッズ

1
@tempforFindMeInTheWoods出力によって終了コードを意味する場合、通常どおり、?変数内に保存されている場合はtry echo $?
-jimmij

1
@tempforFindMeInTheWoods parted -lダイアログボックスを介してユーザーにコマンドの出力を表示する場合--menuは、おそらくoptionの代わりにoptionを使用することをお勧めします-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

質問のスクリーンショットは、ホイップテール(ncursesではなくnewtを使用して、ダイアログを模倣した機能的に縮小されたプログラム)のように見えます。タイトルとボタンのレンダリング方法は各プログラムに組み込まれているため、外観が異なります。

以下は、ウィップテールまたはダイアログのいずれかの元のスクリーンショットを複製するスクリプトです。

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

比較のために、ホイップテール付きのスクリーンショット:

ホイップテール付きのスクリーンショット

およびダイアログ付き:

ダイアログ付きのスクリーンショット

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

ダイアログ(およびウィップテール)は、線、色などの表示を管理するためにライブラリを使用します。しかし、RedtのanacondaプログラムでPythonから呼び出される共有ライブラリ(同じ外観)としてnewtが使用されることもあります。同じ行に沿って、カーネル構成プログラムはダイアログの(カットダウン)コピーとして開始され、lxdialogPythonからnewtが使用されるのと同じように(元のプログラムなしで)共有ライブラリを使用して機能に進化しました。

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.

参考文献:


11

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

ウィキペディアでは、ncursesについて次のように説明しています。

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

たとえば、menuconfigカーネル構成ツールで広く使用されています。 Linuxカーネルmenuconfigツールのスクリーンショット

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


11
ncursesCライブラリです。(私が正しく理解している場合)OPはスクリプト環境(bash用)を望んでいますmenuconfigはCで記述されています。dialog他の回答によると、の代替として、 bashで記述されたBash Simple Cursesに言及することができます(依存tput)。
ルニウム

@Runium:説明とBash Simple Cursesへのリンクをありがとう。
Thawn

2
それでも、それがncursesこの基礎であることに言及することは有用であり、それは質問のより一般的なバージョンに答えます...ここのタイトルのようなものです:)
underscore_d

-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)

オプション付きのZenityダイアログエントリ

password=$(zenity --password)

zenity-パスワード

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

zenity-ファイル選択

zenity --help

zenity-ヘルプ結果

zenity --help-general 

zenity --help-general結果

zenity --help-entry

zenity-ヘルプエントリの結果

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

dialog

ダイアログ

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

スクリプトthoのさらなる実行を停止し、中断します。行:echo $?、決して起こらない

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.