ZeusYu

用ruby/tk玩桌面程序

Tags: ruby, tk, ocra, 桌面应用

最近写了一些ruby脚本,完成一些小功能,觉得颇为上瘾。不过,运行的时候老要在命令行终端里输入各种参数,用起来不是很方便,还是觉得有个桌面程序比较方便,于是我就想着怎么改造已有的脚本,把它做成一个易用的桌面程序来玩玩。找来找去,ruby还是有不少桌面框架工具支持的,tk就是个不错的选择,简单易用。

改造的准备工作非常简单:

  1. 安装ruby,windows下的一键安装包非常好使,还自带了Ruby/Tk,不用再找额外的ruby扩展就能调用tk开发程序了。

  2. 安装tk, ActiveState提供了所有常见平台上的Tcl/Tk二进制安装包,直接下载安装即可,也没什么需要设置的

配置完环境,就能进行开发了,先起个基本窗口

require 'rubygems'  
require 'tk'  
Tk = TkRoot.new{
   title 'Hello world'
}  
Tk.mainloop

通过“TkRoot.new”构造主窗口对象,之后调用“Tk.mainloop”启动主事件循环创建整个图形界面,正常情况下,一个标题为“Hello World”的窗口就出现了。

当然,窗口仅仅是个开始,一个可用的桌面程序,少不了各种各样的输入框、按钮,Ruby/TK提供了许多类来实现小部件,譬如TkButton,TkLabel,TkEntry等等,创建部件的时候,必须给它指定父对象,如之前创建的这个窗口

require 'rubygems'  
require 'tk'  
Tk = TkRoot.new{
   title 'Hello world'
}  
TkButton.new(Tk){
   text '戳我!'
}
Tk.mainloop

以上示例就是在窗口中添加了一个按钮,其中“text ‘戳我!’”是替按钮设置的属性。(在这边插一句,本来,还可以通过哈希表的形式设置部件的属性,但我觉得这样比较好看,让我有种html+css的即视感)

好,有了按钮,我们是不是该做些什么交互操作呢,点击按钮,让按钮上的文字发生变化吧。修改按钮部件的代码块

button = TkButton.new(Tk){
   text '戳我!'
   command {
       button.text = '戳得我好爽!'
   }
}

哦也,程序动起来了。

当然,Ruby/Tk有另外的绑定事件的方式, button.bind('Enter'){button.text = '鼠标进来了'}
这种方式更灵活,也更体现“放置一个部件,绑上一些动作”这样的理念。

一个程序,不肯只有一个按钮,部件一多,必然涉及到布局问题,tk有三种布局方式

  1. place方式绝对定位。place('height'=>50,'width'=> '100','x'=>20,'y'=>40)
  2. grid方式表格定位。grid(row'=>1,'column'=> 1)
  3. pack填空方式。pack('side'=>'top','fill'=>'both')

其中pack填空方式比较灵活。按照顺序执行程序创建部件时,会根据pack的参数,把部件填入窗口中的剩余空白。具体可参考这个图

require 'tk'
title_text="pack 方式示例程序"
root=TkRoot.new{title title_text}
TkButton.new(root, 'text'=>'按钮1').pack('side'=>'top','fill'=>'both')
TkButton.new(root, 'text'=>'按钮2').pack('side'=>'left','fill'=>'both')
TkButton.new(root, 'text'=>'按钮3').pack('side'=>'bottom','fill'=>'both')
TkButton.new(root, 'text'=>'按钮4').pack('side'=>'right','fill'=>'both')
TkButton.new(root, 'text'=>'按钮5').pack('side'=>'top','fill'=>'both')
Tk.mainloop
}

tk pack布局
实际操作的时候pack方法与frame部件配合使用,效果更佳。

关于Ruby/Tk的可用的部件及其具体属性,Ruby/Tk Guide上有着更为详细的说明。

在具体操作中,需要注意的是,Tk提供一个特殊TkVariable.new方法来创建变量,在不同部件间传递信息,这对减少全局变量的使用非常有帮助。

程序写完了,我突然发现一个问题,这用ruby写的东西怎么分发呢?用户那边可没有ruby环境啊,对于一般windows用户而言,我们还得增加一个环节,生成exe文件。由于一般情况下没什么人用ruby写可执行文件,这方面的东西比较少,但幸运的是,我们找到了ocra(One-Click Ruby Application)。

作为一个ruby2exe的工具,它安装起来非常简单gem install ocra即可。
安装完成之后,在终端中执行以下命令,完成打包工作
ocra [ruby/tk path] --add-all-core --windows --no-autoload --gem-full [rb file]
关于ocra,这里有更详细的介绍。

最后是我的两个渣程序,再难看也还是摆出来吧。
https://github.com/ZeusYu/QRCode-Mass-Producters
https://github.com/ZeusYu/eDoc_OpenCourse_Generator