मैं टर्मिनल-आधारित GUI कैसे बनाऊँ?


50

मैं अपनी बैश स्क्रिप्ट को अनुकूलित करने के लिए एक टर्मिनल-आधारित वातावरण बनाने के लिए देख रहा हूं । मैं इसे इस तरह देखना चाहता हूं:

डेबियन स्थापित करें


4
देखो dialog, जो यह उपयोग करने के लिए प्रकट होता है।
डोपघोटी


मुझे लगता है कि टर्मिनल-आधारित GUI एक TUI है (जो CLI से भिन्न है)।
यूनिवर्सलीयूनीकाइड

"तुई" एक आरएच शब्द IIRC है। whiptail> dialogयह भी
ब्राचली

@ ब्रेचली: जीडीबी tuiअपने स्प्लिट-विंडो मोड के लिए भी उपयोग करता है ( layout regउदाहरण के लिए रजिस्टर, स्रोत, और कमांड tui reg vecदिखाता है) , और रेग विंडो में वेक्टर रजिस्टरों को दिखाने के लिए (एक लचीले तरीके से नहीं, ताकि भाग वास्तव में उपयोगी न हो: /) । आईडीके अगर रेडहट ने उस फीचर को जोड़ा पैच लिखा है, या यहां तक ​​कि यह कितना पुराना है।
पीटर कॉर्डेस

जवाबों:


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डिफॉल्ट आउटपुट डिफेंडर टू स्टडर, स्टैडआउट नहीं।

और हमेशा की तरह, man dialogआपका दोस्त है।


सुंदर "ब्ला ब्ला ब्ला ..." लेकिन आप आउटपुट को कैसे लेते हैं?
tempforFind Me In The Woods

1
@tempforFindMeInTheWoods यदि आउटपुट से आपका मतलब एक्जिट कोड से है, तो usuall जैसा है: इसे ?वेरिएबल के अंदर स्टोर किया जाता है , कोशिश करें echo $?
जिमीज

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
फेरीबिग

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

और तुलना के लिए, स्क्रीनशॉट के साथ whiptail:

व्हिपटेल के साथ स्क्रीनशॉट

और संवाद के साथ:

डायलॉग वाला स्क्रीनशॉट

शीर्षक और बटनों की अलग-अलग उपस्थिति के अलावा, संवाद डिफ़ॉल्ट रूप से अलग-अलग रंगों का उपयोग करता है (हालांकि यह कॉन्फ़िगर करने योग्य है- स्क्रीनशॉट देखें ), और यह स्क्रीन पर कम लाइनों का उपयोग करता है।

डायलॉग (और व्हिपटेल) लाइनों, रंगों आदि के प्रदर्शन के प्रबंधन के लिए पुस्तकालयों का उपयोग करते हैं, लेकिन आप रेड हैट एनाकोंडा कार्यक्रम में इस्तेमाल किए गए न्यूट को एक साझा पुस्तकालय के रूप में भी देख सकते हैं जिसे अजगर (उसी रूप के साथ) कहा जाता है । उसी पंक्तियों के साथ, कर्नेल कॉन्फ़िगरेशन प्रोग्राम संवाद की (कट-डाउन) कॉपी के रूप में शुरू हुआ, और फिर साझा लाइब्रेरी (मूल lxdialogकार्यक्रम के बिना ) का उपयोग करके सुविधाओं में विकसित हुआ, जैसे कि न्यूटन का उपयोग अजगर से किया जाता है।

बैश से - आप सबसे अधिक इस्तेमाल की जाने वाली सुविधाओं के लिए या तो डायलॉग या व्हिपटेल का उपयोग कर सकते हैं। किसी ने उन (पर्ल में) के लिए एक रैपर लिखा था, स्क्रिप्ट को अधिक आसानी से उन या कुछ अन्य लोगों के उपयोग की अनुमति देने के लिए, लेकिन आप सीधे डायलॉग का उपयोग करने से बेहतर हैं क्योंकि पर्ल मॉड्यूल अनिवार्य रूप से सामान्य-भाजक है।

संवाद स्रोतों में कमांड-लाइन विकल्पों में से अधिकांश के साथ सभी विगेट्स के उदाहरण शामिल हैं:

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 (नया शाप) एक प्रोग्रामिंग लाइब्रेरी है जो एक एपीआई प्रदान करती है जो प्रोग्रामर को टर्मिनल-स्वतंत्र तरीके से टेक्स्ट-आधारित उपयोगकर्ता इंटरफेस लिखने की अनुमति देती है। यह "GUI-like" एप्लिकेशन सॉफ़्टवेयर विकसित करने के लिए एक टूलकिट है जो एक टर्मिनल एमुलेटर के तहत चलता है

यह व्यापक रूप से उपयोग किया जाता है, उदाहरण के लिए, menuconfig कर्नेल कॉन्फ़िगरेशन टूल में: लिनक्स कर्नेल menuconfig टूल का स्क्रीन शॉट

चूंकि आप बैश का उपयोग कर रहे हैं, आप बैश सिंपल कर्स का उपयोग कर सकते हैं (जैसा कि नीचे टिप्पणी में रुनियम द्वारा उल्लेख किया गया है)।


11
ncursesएक सी-लाइब्रेरी है। (अगर मैं सही तरीके से समझूं तो) ओपी एक स्क्रिप्टिंग माहौल (बैश के लिए) चाहता है । menuconfigC. में लिखा गया है। dialogअन्य उत्तर के अनुसार, आप शायद बैश सिंपल कर्स का उल्लेख कर सकते हैं, जो बैश में लिखा गया है (भरोसा करते हुए tput)।
रनियम

@Runium: स्पष्टीकरण और बैश सरल शाप के लिए लिंक के लिए धन्यवाद।
थावन

2
फिर भी, यह उल्लेख करना उपयोगी था कि ncursesइसका आधार क्या है, और यह प्रश्न के एक अधिक सामान्य संस्करण का उत्तर देता है ... जैसे शीर्षक में एक यहां :) :)
अंडरस्कोर_ड

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

विकल्पों के साथ zenity संवाद प्रविष्टि

password=$(zenity --password)

ज़ेनिटी --पासवर्ड

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

zenity --file-selection

zenity --help

zenity --help परिणाम

zenity --help-general 

zenity -help-general result

zenity --help-entry

zenity --help-entry result

अन्य ग्राफिकल यूजर इंटरफेस (गुई)

dialog

संवाद

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

स्क्रिप्ट थियो का आगे निष्पादन रोक देता है, उसे तोड़ देता है। लाइन: गूंज $? , कभी नहीं होगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.