Bagaimana cara membuat GUI berbasis terminal?

50

Saya ingin membuat lingkungan berbasis terminal untuk mengadaptasi skrip Bash saya . Saya ingin terlihat seperti ini:

Instal Debian

tempforFind Me In The Woods
sumber
4
Lihat ke dalam dialog, yang tampaknya digunakan untuk hal ini.
DopeGhoti
Saya pikir GUI berbasis terminal adalah TUI (yang berbeda dari CLI).
UniversallyUniqueID
"tui" adalah istilah RH IIRC. whiptail> dialogjuga
Bratchley
@Bratchley: GDB juga menggunakan tuiuntuk mode split-window-nya (menunjukkan register, sumber, dan perintah dengan layout regmisalnya, dan tui reg vecuntuk menunjukkan register vektor di jendela reg (dengan cara yang tidak fleksibel, sehingga bagian itu tidak terlalu berguna: /) IDK jika Redhat menulis tambalan yang menambahkan fitur itu, atau bahkan berapa usianya
Peter Cordes

Jawaban:

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

masukkan deskripsi gambar di sini

Respons pengguna disimpan dalam kode keluar, sehingga dapat dicetak seperti biasa: echo $?(perhatikan itu 0berarti "ya", dan 1"tidak" di dunia shell).


Mengenai pertanyaan lain dari bagian komentar:

  • untuk memasukkan ke dalam kotak dialog output dari beberapa perintah cukup gunakan mekanisme substitusi perintah $(), misalnya:

     dialog --backtitle "$(echo abc)" --title "$(cat file)" ...
    
  • untuk memberikan pilihan ganda kepada pengguna, Anda bisa menggunakan --menuopsi alih-alih--yesno

  • untuk menyimpan output dari pilihan pengguna ke dalam variabel, seseorang perlu menggunakan --stdoutopsi atau mengubah deskripsi output baik melalui --output-fdatau secara manual, misalnya:

    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"
    

    Trik ini diperlukan karena dialogsecara default output ke stderr, bukan stdout.

Dan seperti biasa, man dialogadalah temanmu.

jimmij
sumber
itu indah "Bla bla bla ..." tetapi bagaimana Anda menangkap output?
tempforFind Me In The Woods
1
@tempforFindMeInTheWoods jika dengan output yang Anda maksud adalah kode keluar, maka sama seperti usuall: itu disimpan di dalam ?variabel, coba echo $?.
jimmij
1
@tempforFindMeInTheWoods Jika Anda ingin menyajikan output dari perintah parted -lkepada pengguna melalui kotak dialog, maka mungkin opsi --menuadalah pilihan yang lebih baik daripada -yesno. Dalam kasus seperti itu Anda harus bermain sedikit dengan deskriptor untuk menyimpan output ke dalam variabel, misalnya: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
Atau, Anda bisa menggunakan --stdoutopsi.
Thomas Dickey
2
Semua opsi dialog dijelaskan dalam manual:man dialog
Ferrybig
34

Tangkapan layar dalam pertanyaan tersebut terlihat seperti whiptail (program yang secara fungsional dikurangi dengan meniru dialog , menggunakan newt daripada ncurses ). Cara judul dan tombol ditampilkan di setiap program, membuatnya terlihat berbeda.

Berikut ini adalah skrip yang menduplikasi tangkapan layar asli, baik untuk whiptail atau 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))

dan untuk perbandingan, tangkapan layar dengan cambuk:

tangkapan layar dengan cambuk

dan dengan dialog:

tangkapan layar dengan dialog

Selain tampilan berbeda dari judul dan tombol, dialog menggunakan warna yang berbeda secara default (meskipun itu dapat dikonfigurasiā€” lihat tangkapan layar ), dan menggunakan lebih sedikit garis pada layar.

dialog (dan cambuk) menggunakan pustaka untuk mengelola tampilan garis, warna, dll. Tetapi Anda juga dapat melihat kadal yang digunakan dalam program anaconda Red Hat sebagai pustaka bersama yang disebut dari python (dengan tampilan yang sama). Sepanjang baris yang sama, program konfigurasi kernel dimulai sebagai salinan dialog (cut-down), dan kemudian berevolusi menjadi fitur menggunakan pustaka bersama (tanpa lxdialogprogram asli ) seperti cara newt digunakan dari python.

Dari bash - Anda bisa menggunakan dialog atau whiptail untuk fitur yang paling umum digunakan. Seseorang menulis pembungkus untuk mereka (dalam perl) untuk memungkinkan skrip untuk lebih mudah menggunakan keduanya atau beberapa lainnya, tetapi Anda lebih baik menggunakan dialog langsung karena modul perl pada dasarnya adalah common-denominator.

Sumber dialog termasuk contoh semua widget bersama dengan sebagian besar opsi baris perintah:

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.

Bacaan lebih lanjut:

Thomas Dickey
sumber
11

Saya percaya paket yang Anda cari adalah ncurses .

Wikipedia menggambarkan ncurses sebagai berikut:

ncurses (kutukan baru) adalah pustaka pemrograman yang menyediakan API yang memungkinkan pemrogram untuk menulis antarmuka pengguna berbasis teks dengan cara yang bebas terminal. Ini adalah toolkit untuk mengembangkan perangkat lunak aplikasi "mirip GUI" yang berjalan di bawah emulator terminal

Ini banyak digunakan, misalnya, di alat konfigurasi kernel menuconfig: Tangkapan layar alat menuconfig kernel Linux

Karena Anda menggunakan bash, Anda dapat menggunakan Bash Simple Curses (seperti yang disebutkan oleh Runium dalam komentar di bawah).

Gadai
sumber
11
ncursesadalah sebuah C-library. (Jika saya mengerti dengan benar) OP ingin lingkungan skrip (untuk bash). menuconfigditulis dalam C. Sebagai alternatif dialog, sesuai jawaban lain, Anda mungkin bisa menyebutkan Bash Simple Curses yang ditulis dalam bash (mengandalkan tput).
Runium
@Runium: Terima kasih atas klarifikasi dan tautan ke Bash Simple Curses.
Gadai
2
masih, berguna untuk menyebutkan bahwa ncursesini adalah dasar dari ini, dan itu menjawab versi yang lebih umum dari pertanyaan ... seperti yang ada di judul di sini :)
underscore_d
-1

kenyamanan

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 entri dialog dengan opsi

password=$(zenity --password)

zenity --password

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

zenity --pilihan berkas

zenity --help

zenity --membantu hasil

zenity --help-general 

zenity --membantu hasil umum

zenity --help-entry

zenity --membantu entri hasil

antarmuka pengguna grafis lainnya (gui)

dialog

dialog

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

menghentikan eksekusi skrip lebih lanjut, hentikan. baris: echo $? , tidak akan pernah terjadi

FireInTheSky
sumber