| Ruby/Tk 入门篇:初识 Ruby/Tk |
|
| 作者是 Administrator | ||||||||||||||||||||||||||||||||||||||||||||||||
| 2008-01-10 07:12:37 | ||||||||||||||||||||||||||||||||||||||||||||||||
|
本文主要涉及如下内容:
什么是 Ruby?
什么是 Tcl?
什么是 Tk?
什么是 Ruby/Tk?
下载并安装 Ruby
下载并安装 Tcl/Tk
关于开发工具
图 1. “你好!中国”示例程序
列表 1. “你好!中国”示例程序
正如您所看到的,Ruby/Tk 程序相当的简洁 - 首先,您需要加载 Ruby/Tk 扩展(require 'tk'语句),接着通过语句“TkRoot.new”构造一个主窗口对象,然后向这个主窗口对象添加需要的小部件,最后调用“Tk.mainloop”启动主事件循环以创建整个图形界面。
Ruby/Tk 提供了很多的类来实现不同的小部件。Ruby/Tk 小部件的命名规范遵循一个统一的原则:将 Tk 小部件名称之前加上"Tk"二字。例如,Tk 中的 Label 由 Ruby/Tk 中的 TkLabel 类实现,而 Button 由 TkButton 类实现。Ruby/Tk 小部件由 new 方法创建,并且要指定父对象。显式地指定父对象是一个好习惯。如果父对象没有指定,默认为根对象,也就是 TkRoot 的实例。 在构造小部件的时候一般都需要设置属性。在 Ruby/Tk 中,设置属性的方式通常有两种:一种是如“你好!中国”示例程序所示,通过一个代码块来设置属性;另一种是用哈希表的方式。例如,“你好!中国”示例中的 TkLabel 用哈希表的方式设置属性的代码如下:列表 2. 用哈希表的方式设置属性
命令绑定
列表 4. 给 command 属性指定命令(方式 2)
请注意,在“方式 2”中用到了一个方法 lambda,通过它能够生成显式的 Proc 对象。 通过 TkVariable 代理,可以将一个变量绑定到一个小部件。当小部件的值发生改变时,变量的值会随之变化;反之,当变量的值发生改变时,小部件的值也会随之变化。让我们来看一个有趣的程序。 code type="section" width="100%"> 列表 5. 变量绑定示例代码
运行结果如图: 图 2. 变量绑定示例程序-初始界面
图 3. 变量绑定示例程序-运行结果
如图所示,两个输入框被绑定到同一个 TkVarible 实例,当在第一个输入框中输入“hello”的时候,第二个输入框也会显示“hello”;反之亦然。 如何在运行时修改小部件的属性呢?每个小部件都支持 configure 方法,该方法跟 new 方法一样通过代码块或哈希表的方式在运行时修改小部件属性。例如,我们修改“你好!中国”示例程序如下: 列表 6. 动态设置小部件属性示例代码
图 4. 动态设置小部件属性示例程序-初始界面
图 5. 动态设置小部件属性示例程序-运行结果
如图所示,当点击“变色”按钮,显示文本的标签的 configure 方法被调用。“foreground”属性被重新设置为“red”,因此文本“你好!中国”变成红色。 通过调用小部件的 cget 方法能够获得小部件属性,示例代码如下: 列表 7. 获取小部件属性示例代码
输出结果: 列表 8. 获取小部件属性示例程序输出结果
对小部件的进行操作有很多种,比如“鼠标点击”、“鼠标双击”、“鼠标滑过”等等,所有这些都被称为“事件”。Ruby/Tk 通过小部件的 bind 方法为某一事件绑定相应的行为。我们仍然在“你好!中国”示例程序的基础上进行修改。
我们给按钮定义了两个事件绑定:当“进入”(Enter 事件)按钮时,修改文本颜色为红色;当“离开”(Leave 事件)按钮时,修改文本颜色为黑色。因此当鼠标滑过按钮的时候,您可以看到文本的颜色变化。 上面的示例非常简单,事实上事件名称可以是多个通过连接符分隔的字符串组成,其格式为“修饰符-修饰符-事件类型-细节”。“修饰符”包括“Button1”、“Control”、“Alt”、“Shift”等等,从任何 Tk 的文档里您都可以获得完整的“修师符”列表。 “事件类型”的名称来自于 X11 命名规范。“事件类型”的值包括“ButtonPress”、“KeyPress”、“Expose”等等。关于“细节”的值,对按钮而言,它是整数1到5当中的一个值;对按键而言,它是键的符号。例如,形如“Control-Button1-ButtonRelease”(等同于“Control-ButtonRelease-1”)的事件会在 Control 键被按下,同时鼠标键 1 被释放的时刻触发。您可以通过以下代码来体验一下该事件的效果。 列表 10. 事件“Control-ButtonRelease-1”示例代码
Ruby/Tk 提供了 TkCanvas 类以及其他一些类来支持绘图功能。一般而言,这样的一些类都以 Tkc 开头,c 表示 Canvas,例如 TkcLine、TkcOval 等等。下面是一个简单的程序示例。 列表 11. 绘图支持示例代码
该代码的输出结果如下: 图 6. 绘图示例代码运行结果
TkCanvas、TkListbox 以及 TkText 允许被设置滚动条。以下代码示范了如何为 TkText 设置滚动条,通过运行该示例代码,您将看到小部件与滚动条两者是如何交互的。
首先,我们创建一个 TkScrollbar 的实例,并指明它是在垂直方向上滚动的(orient 'vertical')。由于滚动条和小部件之间的影响是相互的,所以接下来为滚动条指定 command 方法,该方法回调了 TkText 的 yview 方法,从而实现了滚动条对 TkText 的影响。然后,为 TkText 定义 yscrollcommand 方法,该方法回调滚动条的 set 方法,从而影响滚动条的显示。
Ruby/Tk 有提供了三种方式管理小部件布局:place 方式、grid 方式以及 pack 方式。下面让我们一一来看这三种布局方式的不同。 每个小部件都有 place 方法,该方法用 place 方式管理小部件的位置和大小。先让我们看一个示例程序。 图 7. place 方式示例代码运行结果
其代码如下: 列表 13. place 方式示例代码
两个按钮怎么会重叠呢?正如大家看到的,place 方式只是简单地根据开发者为小部件指定的位置和大小放置它们。很多“图形界面构建器”程序都采用这种方式:当用户从“工具箱”中拖放一些小部件到工作区域之后,便采用 place 方式 生成源代码。这种方式看上去很不错,但是有没有问题呢?这种方式的确存在问题。当把程序运行在不同的操作系统或者配置不同的计算机上时,由于不同系统的系统字体可能是不同的,显示效果可能就会出乎意料。例如,原来一个 40 像素宽的按钮可能显示成60像素大小,这样就有 可能与相邻的小部件叠加起来。因此,很多人不会在实践中大量运用这种方式。 grid 方式用一种“表格”的方式来管理其中的小部件,通过指定“行”和“列”的值确定小部件的位置。让我们来看一段示例代码以及运行结果。 列表 14. grid 方式示例代码
运行结果如下: 图 8. grid 方式示例代码运行结果
正如您所看到的,grid 方式采用一种十分“规矩”的方式放置小部件,它用相同的值限制其中小部件的宽度和高度。通过运用这种方式,当小部件不能撑满单元格时,还可以通过设置“sticky”属性的值来指定其贴靠的方向;另外,通过设置属性“columnspan”和“rowspan”的值,使小部件可以占据多个单元格。当然,grid 方法提供的属性远不只本文所涉及的这些,具体的请参阅Tk文档。 在实践中,使用的最多的是 pack 方式。它不仅使用简单,而且有很强的灵活性。pack 方式采用一种称为“空”的模式管理小部件的位置和大小。最开始整个窗口是“空”的,当放入小部件的时候,您需要为 pack 方法指定“side”参数(该参数代表您要把小部件放在矩形“空”区域的哪一边,有效值为“left”、“right”、“top”以及“bottom”),不管小部件是不是能将“那一边”撑满,pack 方式会将整个“空”区域的整个“那一边”给这个小部件,并且从整个“空”区域中减去这个小部件占据的大小。之后加入的小部件遵循相同的方式在剩余的“空”区域中占据某一边。如果您仍不能理解这个规则,请看下面的示例。 列表 15. pack 方式示例代码
运行结果: 图 9. pack 方式示例代码运行结果
当您根据代码,按照逆时针方向,从“按钮 1”到“按钮 5”观察它们所占据的位置和大小时,就能够理解这种所谓“空”的模式。
前面提到的 TkButton、TkCanvas 等都是 Tk 的核心小部件。除此之外,还有很多第三方的小部件,我们称它们为“Tk 扩展”。这些第三方的 Tk 小部件往往比核心小部件更加强大。既然有“Tk 扩展”,就必然有“Ruby/Tk 扩展”与之对应。您可以在 Ruby 的安装目录中找到它们:目录“RUBY_INSTALL_DIR\lib\ruby\RUBY_VERSION_NUMBER\tk”中是核心 Ruby/Tk 代码,而目录“RUBY_INSTALL_DIR\lib\ruby\RUBY_VERSION_NUMBER\tkextlib”中是 Ruby/Tk 扩展代码。
Ruby/Tk 与 Perl/Tk 极其得相似,因此,在学习 Ruby/Tk 开发时,您可能需要参考一些关于 Perl/Tk 的书,比如《Mastering Perl-Tk》、《Perl/Tk Pocket Reference》等等。尤其是当您不知道某个小部件有哪些可用的属性时,完全可以查阅 Perl/Tk 的参考手册。希望本文对于您学习 Ruby/Tk 能有所帮助。有任何问题,请发邮件给我( 这个 E-mail 地址已经被防止灌水恶意程序保护,您需要启用 Java Script 才能观看 ),我会尽力回答您的问题。
|
||||||||||||||||||||||||||||||||||||||||||||||||
| 最近更新 ( 2008-01-10 07:12:37 ) | ||||||||||||||||||||||||||||||||||||||||||||||||

