Terminal tabanlı bir GUI'yi nasıl oluşturabilirim?


50

Bash betiğimi uyarlamak için terminal tabanlı bir ortam yaratmak istiyorum . Bunun gibi görünmesini istiyorum:

Debian kurulumu


4
Şuna bak dialog, bunun ne gibi göründüğü.
DopeGhoti


Terminal tabanlı bir GUI'nin (CLI'dan farklı olan) bir TUI olduğunu düşünüyorum.
UniversallyUniqueID

"tui", bir RH terimi IIRC'dir. whiptail> dialogayrıca
Bratchley

@Bratchley: GDB ayrıca tuibölünmüş pencere modu için de kullanılır ( layout regörneğin, kayıtları, kaynağı ve komutları örneğin tui reg vecile gösterir) ve vektör pencerelerini reg penceresinde gösterir (esnek olmayan bir şekilde, bu kısım gerçekten işe yaramaz: /) IDK, eğer Redhat bu özelliği ekleyen yamayı yazdıysa, hatta kaç yaşındaysa,
Peter Cordes

Yanıtlar:


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

görüntü tanımını buraya girin

Kullanıcı yanıtı çıkış kodunda saklanır, bu nedenle her zamanki gibi basılabilir: echo $?( 0"evet" anlamına gelir 1ve kabuk dünyasında "hayır" dır).


Yorum bölümündeki diğer sorularla ilgili:

  • iletişim kutusuna koymak için, bazı komutların çıktısını sadece komut değiştirme mekanizmasını kullanın $(), örneğin:

     dialog --backtitle "$(echo abc)" --title "$(cat file)" ...
    
  • kullanıcıya birden fazla seçenek vermek için, --menuyerine seçeneği kullanabilirsiniz--yesno

  • Kullanıcı seçiminin çıktısını değişkene depolamak için --stdoutseçeneği kullanmak ya da çıktı tanımlayıcısını ya yoluyla --output-fdya da elle değiştirmek gerekir, örneğin:

    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"
    

    Bu numara gereklidir, çünkü dialogvarsayılan olarak stdout'a değil, stderr'ye çıkar.

Ve her zamanki gibi man dialog, arkadaşın.


bu güzel "Bla bla bla ..." ama çıktıyı nasıl yakalarsın?
tempforFind Me Ormanda

1
@tempforFindMeInTheWoods eğer çıktıyla çıkış kodunu kastediyorsanız, o zaman her zamanki gibi: ?değişken içinde saklanırsa deneyin echo $?.
jimmij

1
@tempforFindMeInTheWoods Komutun çıktısını parted -lkullanıcıya iletişim kutusu aracılığıyla sunmak istiyorsanız, muhtemelen seçenek --menuyerine daha iyi bir seçimdir -yesno. Bu durumda çıktıyı değişkene koymak için tanımlayıcılarla biraz oynamanız gerekir, örneğin: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
Veya --stdoutseçeneği kullanabilirsiniz .
Thomas Dickey,

2
Tüm diyalog seçenekleri kılavuzda açıklanmıştır:man dialog
Ferrybig

34

Sorudaki ekran görüntüsü whiptail gibi görünüyor ( ncurses yerine newt kullanarak, işlevsel olarak azaltılmış bir programı taklit eden bir iletişim kutusu ). Başlık ve düğmelerin oluşturulma şekli, her programın içine yerleştirilmiştir ve farklı görünmelerini sağlar.

İşte whiptail veya diyalog için orijinal ekran görüntüsünü kopyalayan bir script:

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

ve karşılaştırma için, whiptail ile ekran görüntüsü:

whiptail ile ekran görüntüsü

ve iletişim kutusu:

iletişim kutusuyla ekran görüntüsü

Başlığın ve düğmelerin farklı görünümünün yanı sıra, iletişim kutusu varsayılan olarak farklı renkler kullanır (yapılandırılabilir olmasına rağmen - ekran görüntülerine bakın ) ve ekranda daha az satır kullanır.

diyalog (ve whiptail), satırların, renklerin vb. gösterimini yönetmek için kütüphaneler kullanır. Ancak Red Hat anakonda programında python denilen paylaşılan bir kütüphane olarak kullanılanları da görebilirsiniz (aynı görünüme sahip). Aynı satırlar boyunca, çekirdek konfigürasyon programı diyaloğun (kesilmiş) bir kopyası olarak başladı ve daha sonra lxdialognewt'ın python kullandığı gibi orijinal bir program olmadan paylaşılan bir kütüphane kullanarak özelliklere dönüştü .

Bash - en sık kullanılan özellikler için ya iletişim ya da whiptail kullanabilirsiniz. Birisi komut dosyalarının ya da diğerlerini daha kolay kullanabilmeleri için (perl'de) bunlara bir sarıcı yazdı , ancak perl modülü esasen ortak payda olduğundan doğrudan iletişim kutusunu kullanmaktan daha iyisin.

İletişim kaynakları, komut satırı seçeneklerinin çoğu ile birlikte tüm widget örneklerini içerir:

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.

Daha fazla okuma:


11

Aradığın paketin ncurses olduğuna inanıyorum .

Wikipedia ncurses'ı şu şekilde tarif ediyor:

ncurses (new curses), programcının metin tabanlı kullanıcı arayüzlerini terminal bağımsız bir şekilde yazmasına izin veren bir API sağlayan bir programlama kütüphanesidir. Bir terminal emülatörü altında çalışan "GUI benzeri" bir uygulama yazılımı geliştirmek için bir araç kitidir.

Örneğin, menuconfig çekirdek yapılandırma aracında yaygın olarak kullanılır: Linux çekirdeği menuconfig aracının ekran görüntüsü

Bash kullandığınız için, Bash Simple Curses'ı kullanabilirsiniz (aşağıdaki yorumda Runium tarafından belirtildiği gibi).


11
ncursesbir C-kütüphanedir. (Doğru anlarsam) OP bir komut dosyası oluşturma ortamı istiyor (bash için). menuconfigC'ye yazılmıştır. dialogDiğer yanıtlara göre, bash ile yazılmış Bash Basit Lanetlerden de bahsedebilirsiniz tput.
Runium

@Runium: Açıklama ve Bash Simple Curses ile bağlantı için teşekkür ederiz.
Thawn

2
Yine de, bunun ncursestemeli olduğunu belirtmek faydalı oldu ve bu sorunun daha genel bir versiyonuna cevap veriyor ... buradaki başlıktaki gibi :)
underscore_d

-1

zenity

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)

seçenekleri ile zenity iletişim girişi

password=$(zenity --password)

zenity - şifre

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

zenity - dosya seçimi

zenity --help

zenity - yardım sonucu

zenity --help-general 

zenity - yardımcı genel sonuç

zenity --help-entry

zenity - help-giriş sonucu

diğer grafiksel kullanıcı arayüzleri (gui)

dialog

diyalog

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

tho betiğinin daha fazla çalışmasını durdurur, onu keser. çizgi: echo $? , Asla olmayacak

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.