找回密码
 赶紧注册吧

QQ登录

只需一步,快速开始

查看: 2079|回复: 0
打印 上一主题 下一主题

并展现如何将任何脚本转化成一个令人佩服的 GUI 利用程序 [复制链接]

注意:1、各网友务必提高交友安全意识,不要轻易参加非天府交友网官方举办的见面交友活动,以防酒托,饭托或引发其他危险;请详细阅读《天府交友网服务条款》和《免责申明》!

Rank: 3Rank: 3

升级  63%

跳转到指定楼层
楼主
发表于 2011-10-24 03:13:00 |只看该作者 |倒序浏览
相关的主题文章:

  
   后来男人得了胃病
  
   80、能为别人假想的人
  
   这巧妙的思维让我极其愁闷
  
   衣异衣以意异熠
  
   湖北中烟产业有限义务公司
  

--menu 和 --radiolist 提供一个选择列表,供用户进行选择。两种对话框在功能上是等同的,但是略有不同的视觉风格,以更好地模仿一个 GUI 可能展示的货色。特殊地,--radiolist 命令呈现 ( ) 来模拟单选按钮。
dialog 命令提供通常在图形应用程序中找到的大局部控件:
class Calc   def initialize     @number = 0     @previous = nil     @op = nil   end    def to_s     @number.to_s   end    (0..9).each do |n|     define_method "press_#{n}" do       @number = @number.to_i * 10 + n     end   end    def press_clear     @number = 0   end    {'add' => '+', 'sub' => '-', 'times' => '*', 'div' => '/'}.each do |meth, op|     define_method "press_#{meth}" do       if @op         press_equals       end       @op = op       @previous, @number = @number, nil     end   end    def press_equals     @number = @previous.send(@op, @number.to_i)     @op = nil   end end  number_field = nil number = Calc.new Shoes.app :height => 250, :width => 200, :resizable => false do   background "#EEC".."#996", :curve => 5, :margin => 2    stack :margin => 2 do      stack :margin => 8 do       number_field = para strong(number)     end      flow :width => 218, :margin => 4 do       %w(7 8 9 / 4 5 6 * 1 2 3 - 0 Clr = +).each do |btn|         button btn, :width => 46, :height => 46 do           method = case btn             when /[0-9]/; 'press_'+btn             when 'Clr'; 'press_clear'             when '='; 'press_equals'             when '+'; 'press_add'             when '-'; 'press_sub'             when '*'; 'press_times'             when '/'; 'press_div'           end            number.send(method)           number_field.replace strong(number)         end       end     end   end end
对 Ruby 和 Shoes 的先容不在本文探讨范畴之内,然而这里是一些最主要的结构:
图 3. 一个简单问题
--checklist 显示用户可单独启用或禁用的一个项目列表。
--infobox 仅仅展示信息:它不要求任何输入。信息框依然只是简单地在屏幕上。要延伸其显示,在它和下一个命令之前置入一个 sleep 命令。
ENTRY=`zenity --entry --text "Please enter your name"     --entry-text "Your name" --title "Enter your name" if [ $? == 0 ]; then   zenity --info --text "Hello $ENTRY\!" fi
再次阐明,如果 zenity 的退出代码是 0,那么 ENTRY 有某人的姓名。这里是为使用 Zenity 而重写后的日历示例:
一个组合是 Ruby 脚本语言和 wxWidgets 框架的 Ruby 绑定。Ruby 是面向对象的、富于表示力的且简练的,运行于大部门操作系统之上。wxWidgets 框架还可用于每个主流平台,包括 Mac OS X、Windows®、Linux® 和 UNIX。因为两者都是可移植的,您可以用 Ruby 编写一个应用程序一次,然后随处运行它。另一个更简单的选择是 Shoes。尽管不如 wxWidgets 丰盛,Shoes 学习和使用起来相称简单。清单 2 使用 70 行代码实现了一个计算器。
图 1. --yesno 操作
图 2. 日历对话框
并非每个人都探讨 UNIX;事实上,有些人可能发现命令行很复杂,令人却步。此外,您可能不盼望将全体命令行寄托给常设或无教训的用户。要辅助那些不习惯使用命令行的人,
或构建缭绕 shell 的自定义解决计划,您可以为您的脚本构建 GUI。有了这样的工具 ― dialog 和 Zenity 是两个值得一提的工具(参见 参考资料) ― 您就可以使用对话框、文件浏览器和其他常见的 “windowing” 控件和技巧来与您的用户交互。事实上,对话框提供更多天然对话:您提出问题,恳求响应,并相应地予以响应。
代码开头 Shoes.app... 创立盘算器的 GUI,为其浮现布局和按钮。Shoes 提供两个容器来装配布局:stack 和 flow。一个 stack 是元素的一个垂直堆栈,其中每个元素直接放在前一个元素下面。一个 flow 尽量严密地包裹元素,直至它到达其边框局限,然后包装其余的元素。(您可以将一个堆栈看作是一个 HTML <div>,将一个流看作 HTML <p>。)您可以使用 Ruby 块创建一个堆栈或一个流。
每个 dialog 变体的输出不同,或是一个单一值,或是一列由空格分隔的带引号值。例如,--checklist 是用于取舍一个或多个选项的一个不错的控件,它发出一列带引号值,其中每个值与一个启用的选项相干。下面演示了一个操作示例:
number_field.replace strong(number) 行通过最新计算结果更新计算器显示。发出 number 以致类调用其本人的 to_s (“to string”) 方法。
本期的 “对话 UNIX” 探讨 dialog 跟 Zenity,并展现如何将任何脚本转化成一个令人佩服的 GUI 利用程序。对传统的、基于文本的界面应用 dialog,Zenity 供给古代作风的视窗化桌面。
RESULT=`dialog --stdout --title "CALENDAR"      --calendar "Please choose a date..." 0 0 9 1 2010` retval=$?
--title 选项使用下一个参数来将一个题目增添到对话框,且可用于任何 dialog 命令。十分像 --yesno,您提供一些文原来提醒用户。接下来,选项 0 0 再次指定主动高度和宽度,选项 9 1 2010 分辨唆使日历中显示的初始日、月和年。选项卡和箭头键改变日历并挑选一个日期。对话框退出后,如果 retval 是 0,RESULT 的值就是选定的日期。图 2 显示日历对话框。
Martin Streicher 是一位 Ruby on Rails 的自在开发人员和 Linux Magazine 的前任主编。Martin 毕业于 Purdue University 并取得计算机迷信学位,从 1986 年起他始终从事 UNIX 类体系的编程工作。他爱好收集艺术品和玩具。
您可以随时输入 dialog --help 来查看惯例列表,输入 dialog 来查看特定选项。dialog 有无数用法。
#!/bin/sh (   echo "10" ; sleep 1   echo "# Updating mail logs" ; sleep 1   echo "20" ; sleep 1   echo "# Resetting cron jobs" ; sleep 1   echo "50" ; sleep 1   echo "This line will just be ignored" ; sleep 1   echo "75" ; sleep 1   echo "# Rebooting system" ; sleep 1   echo "100" ; sleep 1 ) | zenity --progress \   --title="Update System Logs" \   --text="Scanning mail logs..." \   --percentage=0  if [ "$?" = -1 ] ; then   zenity --error \     --text="Update canceled." fi
sub-shell(包括在括号中)履行一系列义务 ― 在这个人为例子中 albeit sleep 延迟 ― 且通过一个管道将输动身出到一个 Zenity 过程表。在每一步之前,sub-shell 发出一个数字来推动进程表,每个 --percentage 0 起始于 0,而后发出一个以 # 开头的字符串来转变状况新闻。因而,过程表沿着步骤标志脚本工作。假如 Zenity 的退出代码是 -1,单击的是 Cancel 按钮。
dialog --yesno "Do you want to continue?" 0 0 rc=$? if [ "${rc}" == "0" ]; then   echo Yes else   echo No fi
--yesno 选项需要至少三个参数:问题文本以及对话框本身的高度和宽度,后者用行和列度量。如果您不需要特定尺寸,老是可认为高度或宽度使用 0,以自动调剂对话框大小。(还有绝对于窗口左下角放置窗口的选项。)图 1 展示运行中的        --yesno。
dialog 使用起来很简单:它仅是另一个 UNIX 命令。您使用命令选项显示您抉择的对话框,然后捕获结果并基于该值执行一些逻辑。dialog 的一些变体直接将命令结果放在特别的 shell 状态变量 $? 中,您应该在 dialog 命令退出后立刻保留或讯问该变量(由于随后的一个命令会即时改变其值)。另外,通常更为庞杂的 dialog 命令变体同时设置 shell 状态变量并天生其余成果。为将事件简单化,dialog 提供 --stdout 选项来将其结果发出到尺度输出,因此便于通过命令求值捕捉数据(带左引号的命令和赋值语句的组合)。
Zenity 提供与 dialog 相同的许多控件。这里是收集名称的一个代码段:
zenity --question --text "Do you want to continue?"
生成的结果如 图 3 所示。(用于演示的机器在运行 Ubuntu 10。)如果您单击 OK,命令返回 0。否则,它返回 1。
向任何 shell 脚本添加对话框
如果您走进一个拥挤的机房,可能会听到有关 “shebangs”、斜线、点、根、管道、端口等等这个那个的闲聊。如果讲到 UNIX®,您无疑会懂得本地术语 ― 有关 UNIX 的缩略词、命令名、快捷键、选项、文件名和方言 ― 且有宾至如归的感到。与其他艺术工作者一样,UINX 用户占有普遍的术语来描述其工作细节。
例如,dialog --yesno 命令是最简单的变体之一。它提出一个问题,提示做出是或否的响应,并返回 $? 中的 0 或 1,详细取决于用户选择了 “Yes” 仍是 “No”。您可以测试 $? 的值并执行一些前提代码。这里是您可以添加到 shell 脚本的一个工作代码段:
其他脚本语言领有相似的库,且 Ruby 自身有更多选择,包含 Ruby Cocoa,可使用 Ruby 在 Mac OS X 上开发 Cocoa 应用程序。选择您喜欢的开源脚本语言,找到一个轻量级 GUI 工具包,然后开端编码。
dialog 选项 --calendar 出现一个日从来容许用户
分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏0

使用道具 举报

※为保护您的个人隐私,防止被恶意盗用,在论坛中不得留下手机、QQ、邮箱等联系方式,否则将被屏蔽!,若有需要,请发送站内消息
您需要登录后才可以回帖 登录 | 赶紧注册吧

关于我们|网站地图|帮助中心|商务合作|法律声明|诚聘英才|联系我们| 时尚 娱乐 成都婚庆公司 网站制作天府星空
Copyright © 2010-2011 天府交友(Www.Tflove.Com)版权所有