如何创建基于终端的 GUI?

如何创建基于终端的 GUI?

我正在寻找创建一个基于终端的环境来适应我的重击脚本写入.我希望它看起来像这样:

Debian 安装

答案1

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

在此输入图像描述

用户响应存储在退出代码中,因此可以照常打印:(echo $?请注意,这0意味着“是”,而1在 shell 世界中则意味着“否”)。


关于评论区的其他问题:

  • 要将某些命令的输出放入对话框中,只需使用命令替换机制$(),例如:

     dialog --backtitle "$(echo abc)" --title "$(cat file)" ...
    
  • 为了给用户多种选择,您可以使用--menuoption 而不是--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是你的朋友。

答案2

问题中的屏幕截图看起来像鞭尾(一个功能简化的程序,模仿对话,使用蝾螈而不是恩诅咒)。标题和按钮的呈现方式内置于每个程序中,使它们看起来不同。

这是一个复制原始屏幕截图的脚本,适用于鞭尾或对话框:

#!/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)使用库来管理线条、颜色等的显示。但是您也可能会看到红帽anaconda程序中使用newt作为共享库,从Python(具有相同的外观)。同样,内核配置程序最初是作为对话框的(删减)副本,然后演变成使用共享库(没有原始程序lxdialog)的功能,就像在 python 中使用 newt 的方式一样。

在 bash 中,您可以使用dialog 或whiptail 来实现最常用的功能。有人写了一个这些的包装器(在 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.

进一步阅读:

答案3

我相信您正在寻找的包是恩诅咒

维基百科ncurses 描述如下:

ncurses(新的curses)是一个编程库,提供API,允许程序员以独立于终端的方式编写基于文本的用户界面。它是一个用于开发在终端仿真器下运行的“类GUI”应用软件的工具包

它的应用很广泛,例如在menuconfig内核配置工具中: Linux 内核 menuconfig 工具的屏幕截图

由于您使用的是 bash,因此可以使用Bash 简单的诅咒(正如 Runium 在下面的评论中提到的)。

答案4

禅宗

zenity --file-selection --directory

# var means variable

var\
=$(
zenity --entry                   \
       --title="title"           \
       --text="text"             \
       --entry-text="entry text" \ 
)                                \
&&
echo "$var"

带有选项的 zenity 对话框条目

password=$(zenity --password)

zenity--密码

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

zenity --文件选择

# ls is a command to list files in a directory

ls $(zenity --file-selection --directory)

# 帮助

zenity --help

zenity --帮助结果

zenity --help-general 

zenity --help-一般结果

zenity --help-entry

zenity --帮助输入结果

其他图形用户界面 (gui)

dialog

对话

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

停止进一步执行脚本,中断它。命令回显 $? , 永远不会发生

相关内容