ฉันจะสร้าง 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 (ในแบบที่ไม่ยืดหยุ่นดังนั้นส่วนนั้นก็ไม่มีประโยชน์จริง ๆ : /) IDK ถ้า Redhat เขียนแพทช์ที่เพิ่มคุณสมบัตินั้นหรือแม้กระทั่งอายุเท่าไหร่
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โดยค่าเริ่มต้นไปยัง stderr ไม่ใช่ stdout

และเช่นเคยman dialogเป็นเพื่อนของคุณ


มันสวยมาก "Bla bla bla ... " แต่คุณจับเอาท์พุทได้อย่างไร?
tempforFind Me In The Woods

1
@tempforFindMeInTheWoods ถ้าคุณหมายถึงการส่งออกรหัสจบแล้วก็เป็น usuall: มันจะถูกเก็บไว้ในตัวแปรลอง? echo $?
jimmij

1
@tempforFindMeInTheWoods ถ้าคุณต้องการที่จะนำเสนอผลลัพธ์ของคำสั่งparted -lไปยังผู้ใช้ผ่านทางกล่องโต้ตอบแล้วอาจจะเป็นตัวเลือกที่เป็นทางเลือกที่ดีกว่าแทน--menu -yesnoในกรณีเช่นนี้คุณจะต้องเล่นกับ descriptors เพื่อเก็บเอาต์พุตลงในตัวแปรตัวอย่างเช่น: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ตัวเลือก
Thomas Dickey

2
ตัวเลือกไดอะล็อกทั้งหมดมีการอธิบายไว้ในคู่มือ:man dialog
Ferrybig

34

ภาพหน้าจอในคำถามดูเหมือนว่าแส้ ( กล่องโต้ตอบเลียนแบบโปรแกรมที่ลดการทำงานโดยใช้ newt แทนที่จะเป็นncurses ) วิธีที่ชื่อและปุ่มแสดงผลถูกสร้างขึ้นในแต่ละโปรแกรมทำให้ดูแตกต่างกัน

นี่คือสคริปต์ที่ทำซ้ำภาพหน้าจอต้นฉบับสำหรับ whiptail หรือ 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))

และสำหรับการเปรียบเทียบภาพหน้าจอพร้อมแส้:

สกรีนช็อตพร้อมแส้

และด้วยการโต้ตอบ:

ภาพหน้าจอพร้อมกล่องโต้ตอบ

นอกเหนือจากลักษณะที่ปรากฏที่แตกต่างกันของชื่อเรื่องและปุ่มโต้ตอบจะใช้สีที่แตกต่างกันตามค่าเริ่มต้น (แม้ว่าจะกำหนดค่าได้ - ดูภาพหน้าจอ ) และใช้บรรทัดน้อยลงบนหน้าจอ

dialog (และ whiptail) ใช้ไลบรารีสำหรับจัดการการแสดงบรรทัดสีและอื่น ๆ แต่คุณอาจเห็น newt ที่ใช้ในโปรแกรม Anaconda Red Hat เป็นไลบรารีแบบแบ่งใช้ที่เรียกว่าจากpython (มีลักษณะเดียวกัน) ในบรรทัดเดียวกันโปรแกรมกำหนดค่าเคอร์เนลเริ่มต้นเป็นสำเนาของกล่องโต้ตอบ (ตัดลง) จากนั้นพัฒนาเป็นคุณลักษณะโดยใช้ไลบรารีที่แชร์ (โดยไม่ต้องใช้lxdialogโปรแกรมดั้งเดิม) เหมือนกับวิธีที่ 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-like" ที่ทำงานภายใต้ terminal emulator

มันถูกใช้อย่างกว้างขวางตัวอย่างเช่นในเครื่องมือการกำหนดค่าเคอร์เนล menuconfig: สกรีนช็อตของเครื่องมือเคอร์เนล menuconfig Linux

เมื่อคุณใช้ bash คุณสามารถใช้Bash Simple Curses (ตามที่ Runium กล่าวไว้ในความคิดเห็นด้านล่าง)


11
ncursesเป็น C-library (ถ้าฉันเข้าใจถูกต้อง) OP ต้องการสภาพแวดล้อมการเขียนสคริปต์ (สำหรับทุบตี) menuconfigเขียนเป็นภาษา C เป็นอีกทางเลือกหนึ่งสำหรับ dialogคำตอบอื่น ๆ คุณอาจพูดถึงBash Simple Cursesซึ่งเขียนด้วย bash (พึ่งพาtput)
Runium

@ Runium: ขอบคุณสำหรับการชี้แจงและลิงค์ไปยัง Bash Simple Curses
รุ่งอรุณ

2
ยังคงมีประโยชน์ที่จะกล่าวถึงว่าncursesเป็นพื้นฐานของเรื่องนี้และจะตอบคำถามทั่วไปมากกว่า ... เหมือนคำถามที่อยู่ในชื่อที่นี่ :)
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)

รายการไดอะล็อก zenity พร้อมตัวเลือก

password=$(zenity --password)

zenity - รหัสผ่าน

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

zenity - เลือกไฟล์

zenity --help

zenity - ช่วยผลลัพธ์

zenity --help-general 

zenity - ช่วยผลลัพธ์ทั่วไป

zenity --help-entry

zenity - ช่วยผลการป้อนข้อมูล

ส่วนต่อประสานกราฟิกกับผู้ใช้อื่น ๆ (gui)

dialog

โต้ตอบ

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

หยุดการทำงานของสคริปต์ต่อไปอีกและทำลายมัน บรรทัด: echo $? จะไม่เกิดขึ้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.