-
如何在Bash Shell脚本中显示对话框
2017-05-02 11:49:00这个教程给出几个如何使用类似zenity和whiptail的工具在Bash ...这两个工具的不同之处在于显示消息框或者对话框的方式。Zenity用GTK工具包创建图形用户界面,而whiptail则在终端窗口内创建消息框。 Zenity 工具 在...这个教程给出几个如何使用类似zenity和whiptail的工具在Bash Shell 脚本中提供消息/对话框的例子。使用这些工具,你的脚本能够告知用户当前程序运行的状态并能与用户进行交互。这两个工具的不同之处在于显示消息框或者对话框的方式。Zenity用GTK工具包创建图形用户界面,而whiptail则在终端窗口内创建消息框。
Zenity 工具
在Ubuntu中安装zenity,运行:
sudo apt-get install zenity
用zenity创建消息框或者对话框的命令是不言自明的,我们会给你提供一些例子来参考。
创建消息框
zenity --info --title "Information Box" --text "This should be information" --width=300 --height=200
消息框截图
创建 Yes/No 询问对话框
zenity --question --text "Do you want this?" --ok-label "Yeah" --cancel-label="Nope"
问题截图
创建输入框并将输入值保存到变量中
a=$(zenity --entry --title "Entry box" --text "Please enter the value" --width=300 --height=200)
echo $a
输入框截图
输入后,值会保存在变量 $a 中。
这是一个获取用户姓名并显示的实际事例。
#!/bin/bash
#
# This script will ask for couple of parameters
# and then continue to work depending on entered values
#
# Giving the option to user
zenity --question --text "Do you want to continue?"
# Checking if user wants to proceed
[ $? -eq 0 ] || exit 1
# Letting user input some values
FIRSTNAME=$(zenity --entry --title "Entry box" --text "Please, enter your first name." --width=300 --height=150)
LASTNAME=$(zenity --entry --title "Entry box" --text "Please, enter your last name." --width=300 --height=150)
AGE=$(zenity --entry --title "Entry box" --text "Please, enter your age." --width=300 --height=150)
# Displaying entered values in information box
zenity --info --title "Information" --text "You are ${FIRSTNAME} ${LASTNAME} and you are ${AGE}(s) old." --width=300 --height=100
这些是运行前面脚本的截图。
例1-问题-1
框1
例1-输入框-1
输入框
例1-输入框-2
输入框
例1-输入框-3
输入框
例1-信息
信息框
别忘了查看也许能帮助到你的有用的zenity 选项。
Whiptail 工具
在Ubuntu上安装whiptail,运行
sudo apt-get install whiptail
用whiptail创建消息框或者对话框的命令也是无需解释的,我们会给你提供一些基本例子作为参考。
创建消息框
whiptail --msgbox "This is a message" 10 40
whiptail消息框截图
创建 Yes/No 对话框
whiptail --yes-button "Yeah" --no-button "Nope" --title "Choose the answer" --yesno "Will you choose yes?" 10 30
whiptail对话框截图
创建有缺省值的输入框
whiptail --inputbox "Enter your number please." 10 30 "10"
whiptail输入框截图
尝试使用输入值要注意的一点是whiptail用stdout显示对话框,用stderr输出值。这样的话,如果你用 var=$(...),你就根本不会看到对话框,也不能获得输入的值。解决方法是交换stdout和stderr。在whiptail命令后面添加 3>&1 1>&2 2>&3 就可以做到。你想获取输入值的任何whiptail命令也是如此。
创建菜单对话框
whiptail --menu "This is a menu. Choose an option:" 20 50 10 1 "first" 2 "second" 3 "third"
whiptail菜单截图
这是一个请求用户输入一个文件夹的路径并输出它的大小的 shell 脚本。
#!/bin/bash
#
#
# Since whiptail has to use stdout to display dialog, entered value will
# be stored in stderr. To switch them and get the value to stdout you must
# use 3>&1 1>&2 2>&3
FOLDER_PATH=$(whiptail --title "Get the size of folder" \
--inputbox "Enter folder path:" \
10 30 \
"/home" \
3>&1 1>&2 2>&3)
if [ -d $FOLDER_PATH ]
then
size=$(du -hs "$FOLDER_PATH" | awk '{print $1}')
whiptail --title "Information" \
--msgbox "Size of ${FOLDER_PATH} is ${size}" \
10 40
elif [ -f $FOLDER_PATH ]
then
whiptail --title "Warning!!!" \
--msgbox "The path you entered is a path to a file not a folder!" \
10 40
else
whiptail --title "Error!!!"
--msgbox "Path you entered is not recognized. Please try again" \
10 40
fi
这是之前例子的一些截图:
例2-输入框
输入框
例2-消息框
消息框
如果你在终端下工作,帮助手册总是有用的。
结论
选择合适的工具显示对话框取决于你期望在桌面机器还是服务器上运行你的脚本。桌面机器用户通常使用GUI窗口环境,也可能运行脚本并与显示的窗口进行交互。然而,如果你期望用户是在服务器上工作的,(在没有图形界面时,)你也许希望能确保总能显示,那就使用whiptail或者任何其它在纯终端窗口显示对话框的工具。
原文发布时间为:2015-06-02
本文来自云栖社区合作伙伴“Linux中国”
-
非模态对话框生成VC++.NET 2003
2008-09-08 14:52:00非模态对话框生成与模态有相似之处,主要不同在于模态采用DoModal函数生成,而非模态采用Create函数;而且非模态对话框生存周期较长,一般和父窗口的生存周期相同。 到添加类一步,非模态与模态都是相同的,由于要...非模态对话框生成与模态有相似之处,主要不同在于模态采用DoModal函数生成,而非模态采用Create函数;而且非模态对话框生存周期较长,一般和父窗口的生存周期相同。
到添加类一步,非模态与模态都是相同的,由于要使用Create函数,因为要在生成非模态对话框的父窗口中添加对话框类的指针,类型为(假设添加类时,非模态对话框类为CModallessDlg)CModallessDlg *,假设指针名为m_pModalessDlg。
在程序的适当处添加下列代码即可生成、显示非模态对话框:
m_pModalessDlg=new CModallessDlg;
m_pModalessDlg->Create(标识,this);m_pModalessDlg->ShowWindow(SW_SHOW);
在退出前要清除生成的非模态对话框:
delete m_pModalessDlg;
m_pModalessDlg=NULL;参考王华、朱时银、史兰等编著《VC++.NET 开发指南与实例详析》, 机械工业出版社
说明:本人是初学者,理解可能偏颇很多,欢迎评论及指点 -
MFC中模态与非模态对话框
2008-05-07 16:34:00VC++中非模态对话框生成与模态有相似之处,主要不同在于模态采用DoModal函数生成,而非模态采用Create函数;而且非模态对话框生存周期较长,一般和父窗口的生存周期相同。 到添加类一步,非模态与模态都是相同的. ...VC++中非模态对话框生成与模态有相似之处,主要不同在于模态采用DoModal函数生成,而非模态采用Create函数;而且非模态对话框生存周期较长,一般和父窗口的生存周期相同。 到添加类一步,非模态与模态都是相同的. 但由于要使用Create函数,因为要在生成非模态对话框的父窗口中添加对话框类的指针,类型为(假设添加类时,非模态对话框类为CModallessDlg)CModallessDlg *,假设指针名为m_pModalessDlg。
在程序的适当处(一般在视图文件中)添加下列代码即可生成、显示非模态对话框:
CModallessDlg *m_pModalessDlg=new CModallessDlg;
m_pModalessDlg->Create(标识,this); // 标识即为所要显示的对话框的ID
m_pModalessDlg->ShowWindow(SW_SHOW);
在退出前要清除生成的非模态对话框:
delete m_pModalessDlg;
m_pModalessDlg=NULL; -
Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好
2011-01-28 17:02:08这样虽然解决了上面主窗口一闪而过的问题,但是,如果在my1 对话框出现的时 候不点enterBtn,而是直接关闭对话框,那么此时整个程序应该结束执行,但 是事实是这样的吗?如果你此时对程序进行了改动,再次按下run ... -
pyside写ui界面入门示例
2021-01-20 05:02:13PySide是一个免费的软件,与PyQt不同之处在于使用了LGPL,允许PySide免费的开发商业软件。 PySide有15个模块。这些模块支持对GUI,多媒体,XML,网络以及数据库进行操作。本教程的目的主要是学习其中的两个模块:... -
组件
2012-05-09 20:37:04对话框组件Dialog:界面效果和Frame类似,是一个拥有边框和最大化、最小化、关闭按钮的顶级窗口,其中也可以添加其他的组件或容器,但不同之处在于对话框组件主要用于接收用户某种形式的简单输入,起到“确认”操作...对话框组件Dialog:界面效果和Frame类似,是一个拥有边框和最大化、最小化、关闭按钮的顶级窗口,其中也可以添加其他的组件或容器,但不同之处在于对话框组件主要用于接收用户某种形式的简单输入,起到“确认”操作或“警告/提示”的作用。
Dialog组件的默认布局管理器是BorderLayout类型,且默认初始化为不可见的,需要使用setVisible(true)方法使之显示出来
Dialog组件虽然是顶级窗口,但必须依赖一个其他的窗口而不能单独存在,所依赖的窗口称为对话框的所有者(Owner),通常是Frame或其他Dialog。
当其所有者窗口最小化时,Dialog也会自动隐藏为对用户不可见,当所有者窗口被还原时,Dialog重新变为可见。
通过建立Dialog的子类来建立一个对话框类,然后这个类的一个实例,即该类的一个对象,就是一个对话框。
构造方法
public Dialod(Frame f,String s);
public Dialod(Frame f,String s,boolean b);对话框分为无模式对话框(Modeless Dialog)和有模式对话框(Modal Dialog)两种:
有模式对话框将阻断输入到其所在应用程序中其他所有窗体的内容,例如MS Word中的文件对话框。
无模式对话框显示与否都不影响所在应用程序其他窗体的操作,通常用于提供非必须的辅助性功能,如Word的“查找/替换”对话框。
常用方法
public String getTitle();
public void setTitle();
public void setModal(Boolean model);
public void setSize(int width,int height);
public void setVisible(boolean b);文件对话框FileDialog
文件对话框java.awt.FileDialog,继承了Dialog类,但属于有模式对话框,用于在打开和保存文件时指定文件的路径和文件名。构造方法
public FileDialog(Frame f,String s, int mode);常用方法
public String getDirectory();
public String getFile();需注意,文件对话框仅仅提供了一个文件操作的界面,要真正实现对文件的操作应使用文件的输入输出流(方法loadFile()、saveFile()和saveFileAs()中都用到了文件的输入/输出流的操作)。
典型Swing组件
1 JFrame
继承并扩充啦java.AwtFrame类主要包括DO_NOTHING_ON_CLOSE:默认窗口关闭操作为“误操作即淡季窗口的“关闭”HIDE_ON_CLOSE:默认窗口关闭操作作为“隐藏窗口”,即点击窗口的关闭按钮时隐藏当前的窗口。DISPOEE_ON_CLOSE:默认窗口关闭操作为“销毁操作”
EXIT_ON_CLOSE:默认的为关闭窗口为退出程序
package com.hesi;
import java.awt.*;
import java.awt.event.*;
public class TestDialog extends Frameimplements ActionListener
{
Labelinfo;
DialogquitDialog;
DialogloginDialog;
TextFieldtf_name;
TextFieldtf_psw;
Buttonlogin,regist,help,exit;
publicTestDialog()
{
super("注册窗口");
login=newButton("登录");
regist=newButton("注册");
help=newButton("帮助");
exit=newButton("退出");
Panelp=new Panel();
p.setLayout(newGridLayout(1,4));
p.add(login);
p.add(regist);
p.add(help);
p.add(exit);
info=newLabel("您尚未登录");
add(p,BorderLayout.NORTH);
add(info,BorderLayout.CENTER);
login.addActionListener(this);
exit.addActionListener(this);
addWindowListener(newWindowAdapter()
{
publicvoid windowClosing(WindowEvent e)
{
quit();
}
});
loginDialog=this.createLoginDialog(this);
quitDialog=this.createQuitDialog(this);
setSize(200,150);
setLocation(450,200);
setVisible(true);
}
publicDialog createQuitDialog(Frame f)
{
Dialogd=new Dialog(f,"确认退出对话框",true);
Labelnote=new Label("您确定要退出程序吗?");
Panelp=new Panel();
p.setLayout(newGridLayout(1,2));
Buttonconfirm=new Button("确定");
Buttoncancel=new Button("取消");
confirm.setActionCommand("confirmQuit");
cancel.setActionCommand("cancelQuit");
confirm.addActionListener(this);
cancel.addActionListener(this);
p.add(confirm);
p.add(cancel);
d.setSize(200,100);
d.setLocation(400,200);
d.add(note,BorderLayout.CENTER);
d.add(p,BorderLayout.SOUTH);
returnd;
}
publicDialog createLoginDialog(Frame f)
{
Dialogd=new Dialog(f,"登录对话框",true);
Labelnote=new Label("请输入注册信息");
Panelpa=new Panel();
pa.setLayout(newGridLayout(2,1));
pa.add(newLabel("用户名"));
pa.add(newLabel("密码"));
Panelpc=new Panel();
pc.setLayout(newGridLayout(2,1));
tf_name=newTextField();
tf_psw=newTextField();
tf_psw.setEchoChar('*');
pc.add(tf_name);
pc.add(tf_psw);
Panelpb=new Panel();
pb.setLayout(newGridLayout(1,2));
Buttοnsubmit=new Button("提交");
Buttoncancel=new Button("取消");
submit.setActionCommand("submitLogin");
cancel.setActionCommand("cancelLogin");
submit.addActionListener(this);
cancel.addActionListener(this);
pb.add(submit);
pb.add(cancel);
d.add(note,BorderLayout.NORTH);
d.add(pa,BorderLayout.WEST);
d.add(pc,BorderLayout.CENTER);
d.add(pb,BorderLayout.SOUTH);
d.setSize(200,110);
d.setLocation(400,200);
returnd;
}
publicvoid actionPerformed(ActionEvent e)
{
Strings=e.getActionCommand();
if(s.equals("登录"))
{
loginDialog.setVisible(true);
}
elseif(s.equals("退出"))
{
this.quit();
}
elseif(s.equals("confirmQuit"))
{
System.exit(0);
}
elseif(s.equals("cancelQuit"))
{
quitDialog.setVisible(false);
}
elseif(s.equals("submitLogin"))
{
Stringname=tf_name.getText();
Stringpassword=(tf_psw).getText();
if(name.equals("Scott")&&password.equals("1134"))
{
info.setText("欢迎您:"+name+"用户");
}else
{
info.setText("验证失败,错误的用户/密码!");
}
loginDialog.setVisible(false);
}
elseif(s.equals("cancelLogin"))
{
loginDialog.setVisible(false);
}
}
publicvoid quit()
{
quitDialog.setVisible(true);
}
publicstatic void main(String[] args)
{
newTestDialog();
}
}
-
工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究
2017-02-28 21:22:19(1)针对多窗口类浏览器模式问题,指出并分析了该问题存在的原因,利用Activity的运行机制,通过Fragment栈对主要模块的Webview进行管理,实现对不同模块之间切换的控制。 (2)针对跨域数据交互问题,指出并分析了... -
MFC的程序框架剖析
2015-03-05 09:53:19一个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值,来标识应用程序中的不同对象和同类对象中的不同的实例,诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。... -
windows 程序设计
2011-07-24 21:16:30一个Windows的.EXE文件中有使用到的不同动态链接库的参考数据,所使用的函数即在那些动态链接库中。当Windows程序被加载到内存中时,程序中的呼叫被指向DLL函数的入口。如果该DLL不在内存中,就把它加载到内存中。 ... -
基于AT89S52 单片的频率计
2010-01-04 08:47:37发生周期性变化的信号,因待测信号的不规则,不能直接送入FPGA 芯片中处 理,所以应该首先对待测信号进行放大、降压、与整形等一系列处理。 (2)分频电路 将处理过的信号4 分频,这样可以将频率计的测量范围扩大4 倍... -
vc++ 应用源码包_1
2012-09-15 14:22:12暴风影音只是同我一样从Gabest官方下载到了Media Player Classic的源码,不同的是,暴风影音将Media Player Classic改成了自己的名字并加入了许多的解码器,打包成自己的产品,其实这也无可厚非,关键就在于其作者老爱把... -
vc++ 应用源码包_2
2012-09-15 14:27:40暴风影音只是同我一样从Gabest官方下载到了Media Player Classic的源码,不同的是,暴风影音将Media Player Classic改成了自己的名字并加入了许多的解码器,打包成自己的产品,其实这也无可厚非,关键就在于其作者老爱把... -
vc++ 应用源码包_6
2012-09-15 14:59:46暴风影音只是同我一样从Gabest官方下载到了Media Player Classic的源码,不同的是,暴风影音将Media Player Classic改成了自己的名字并加入了许多的解码器,打包成自己的产品,其实这也无可厚非,关键就在于其作者老爱把... -
vc++ 应用源码包_4
2012-09-15 14:38:35暴风影音只是同我一样从Gabest官方下载到了Media Player Classic的源码,不同的是,暴风影音将Media Player Classic改成了自己的名字并加入了许多的解码器,打包成自己的产品,其实这也无可厚非,关键就在于其作者老爱把... -
vc++ 应用源码包_5
2012-09-15 14:45:16暴风影音只是同我一样从Gabest官方下载到了Media Player Classic的源码,不同的是,暴风影音将Media Player Classic改成了自己的名字并加入了许多的解码器,打包成自己的产品,其实这也无可厚非,关键就在于其作者老爱把... -
vc++ 应用源码包_3
2012-09-15 14:33:15暴风影音只是同我一样从Gabest官方下载到了Media Player Classic的源码,不同的是,暴风影音将Media Player Classic改成了自己的名字并加入了许多的解码器,打包成自己的产品,其实这也无可厚非,关键就在于其作者老爱把... -
Whole.Tomato.Visual.Assist.X.10.6.1842 2011年2月24 破解补丁 dll Cracked 最新破解版
2011-02-24 12:43:49该培训器同默认剖析器的不同之处在于,他们不装载预先设置的符号数据库,因此扩大了Intellisense的范围。Visual Assist X只收集您工程中的头文件和对象信息,这些头文件和对象可以包含在系统、第三方库、MFC或ATL/... -
DameWare NT Utilities 6.8.1.4汉化版
2013-03-30 22:56:58安装过程非常简单,就不再赘述,使用DameWare的最方便之处在于,只需要在管理员本地机器安装该工具,远程客户机不需要进行任何安装和设置,只要知道客户机的管理员账号和密码,就能顺利完成远程管理和维护工作。... -
arcgis工具
2012-10-22 22:37:31arcgis工具总结 1. 要素的剪切与延伸 实用工具 TASK 任务栏 Extend/Trim ...这种方法与完全包含(Completely contain)方法的区别在于:要素间的边界可以接触。例如,使用包含(Contain)方法,即使湖泊的边界和包含该... -
会计理论考试题
2012-03-07 21:04:401.PC机中 Intel8088、80286、80386、80486,PemiumPⅡ、PⅢ是指_D_的不同型号。 A、显示器 B、内存储器 C、外存储器 D、微处理器 2.用高级语言来编写的程序 ___D___ 。 A、称为编译软件 B、经编译后,才称为源程序 C... -
网管教程 从入门到精通软件篇.txt
2010-04-25 22:43:49Windows XP(包括 Windows 2000)的控制台命令是在系统出现一些意外情况下的一种非常有效的诊断和测试以及恢复系统功能的工具。小编的确一直都想把这方面的命令做个总结,这次辛苦老范给我们整理了这份实用的秘笈。 ... -
Visual C++ 2005 入门经典 详细书签版
2013-02-02 16:39:4311.1.1 窗口的元素 577 11.1.2 Windows程序与操作系统 579 11.1.3 事件驱动型程序 579 11.1.4 Windows消息 579 11.1.5 Windows API 580 11.1.6 Windows数据类型 580 11.1.7 Windows程序中的符号 581 ... -
Visual C++ 2005入门经典--源代码及课后练习答案
2013-02-02 16:42:0411.1.1 窗口的元素 577 11.1.2 Windows程序与操作系统 579 11.1.3 事件驱动型程序 579 11.1.4 Windows消息 579 11.1.5 Windows API 580 11.1.6 Windows数据类型 580 11.1.7 Windows程序中的符号 581 ... -
powerbuilder
2013-11-21 17:11:48不同类型的打印机使用不同的控制序列,你需要翻一翻你的打印机手册。由于PowerBuilder使用数值0(即ASCII码为0的字符)结束每个字符串,因此,如果打印控制序列中包含了数值0,应用程序需要使用其它字符在参数string... -
计算机应用技术(实用手册)
2011-07-29 16:32:16这个项目会视内存模块的不同,为接下来四个项目设定最佳的计时方式。默认值为「By SPD」。这个默认值会读取SPD (Serial Presence Detect) 装置的内容,并且依据SPD内容设定这四个项目。内存模块上的EEPROM (只读... -
iPhone开发秘籍(第2版)--源代码
2012-12-11 13:51:22《iphone开发秘籍(第2版)》提供了关于iphone sdk以及iphone开发的全面信息,对iphone sdk中的各种组件做了深入浅出的介绍,包括iphone 3.0 sdk的所有新增特性,同时对iphone开发的基本流程、基本原理和基本原则...
-
同步类容器
-
Docker3-Dockerfile创建镜像的方法(推荐docker file这种方法)
-
libFuzzer视频教程
-
USB驱动Demo安装文档
-
歌声合成从入门到精通
-
NFS 实现高可用(DRBD + heartbeat)
-
STL常用函数自己总结的
-
Mysql数据库面试直通车
-
strace as a fault injection tool.pdf
-
注册表转换工具(reg to bat、vbs).rar
-
MySQL 高可用工具 heartbeat 实战部署详解
-
2021年茶艺师(初级)考试APP及茶艺师(初级)复审考试
-
龙芯生态应用开发基础:C语言精要
-
MaxScale 实现 MySQL 读写分离与负载均衡
-
instanceof,static,抽象类,接口及父类引用指向子类对象详解
-
2020天猫国货食品趋势洞察报告.pdf
-
python连接Oracle基本操作
-
HTML&CSS3.md
-
IT学吧(www.itxueba.cn)[it学吧itxueba.cn]看雪官方课程反勒索软件编程实战篇
-
MHA 高可用 MySQL 架构与 Altas 读写分离