Ruby 简明教程

Ruby - Tk Guide

Introduction

Ruby 的标准图形用户界面 (GUI) 为 Tk。Tk 起初是 John Ousterhout 开发的 Tcl 脚本语言的 GUI。

Tk 拥有独特的识别标记,它是唯一跨平台的 GUI。Tk 可以运行在 Windows、Mac 和 Linux 上,并在每个操作系统上都提供原生观感。

基于 Tk 的应用程序的基本组件被称为窗口小部件。该组件有时也称为窗口,因为在 Tk 中,“窗口”和“窗口小部件”经常可以互换使用。

Tk 应用程序遵循一个窗口小部件层次结构,其中可以在另一个窗口小部件内放置任意数量的窗口小部件,并且这些窗口小部件又可以在另一个窗口小部件内放置,依此类推。Tk 程序中的主窗口小部件被称为根窗口小部件,可以通过制作 TkRoot 类的一个新实例来创建它。

  1. 大多数基于 Tk 的应用程序都遵循相同的循环:创建窗口小部件,将它们放入该界面,最后将与每个窗口小部件关联的事件绑定到一个方法上。

  2. 有三个几何管理器:place、grid 和 pack,这些管理器负责控制界面中每个窗口小部件的大小和位置。

Installation

Ruby Tk 绑定与 Ruby 一起分发,但 Tk 是一个单独的安装程序。Windows 用户可以从 ActiveState’s ActiveTcl 下载一个单次点击的 Tk 安装程序。

Mac 和 Linux 用户可能不需要安装它,因为存在很大几率 Tk 已经与操作系统一同安装了,但如果没有安装,你可以从 Tcl Developer Xchange 下载预构建软件包或获取源代码。

Simple Tk Application

Ruby/Tk 程序有一个典型的结构,即创建主窗口或 root 窗口(TkRoot 的一个实例),向其中添加窗口小部件以构建用户界面,然后通过调用 Tk.mainloop 启动主事件循环。

面向 Ruby/Tk 的传统 Hello, World! 示例看起来像这样 −

require 'tk'

root = TkRoot.new { title "Hello, World!" }
TkLabel.new(root) do
   text 'Hello, World!'
   pack { padx 15 ; pady 15; side 'left' }
end
Tk.mainloop

在这里,在加载 tk 扩展模块之后,我们使用 TkRoot.new 创建了一个根级别框架。然后我们制作了一个 TkLabel 窗口小部件作为根框架的一个子级,同时为该标签设置几个选项。最后,我们打包根框架并进入主 GUI 事件循环。

如果你运行这个脚本,将会产生以下结果 −

ruby tk1

Ruby/Tk Widget Classes

有一系列 Ruby/Tk 类,它们可用于使用 Ruby/Tk 创建所需 GUI。

  1. TkFrame 创建并操纵框架窗口小部件。

  2. TkButton 创建并操纵按钮窗口小部件。

  3. TkLabel 创建并操纵标签窗口小部件。

  4. TkEntry 创建并操纵输入窗口小部件。

  5. TkCheckButton 创建和操作复选框小工具。

  6. TkRadioButton 创建和操作单选按钮小工具。

  7. TkListbox 创建和操作列表框小工具。

  8. TkComboBox 创建和操作列表框小工具。

  9. TkMenu 创建和操作菜单小工具。

  10. TkMenubutton 创建和操作菜单按钮小工具。

  11. Tk.messageBox 创建和操作消息对话框。

  12. TkScrollbar 创建和操作滚动条小工具。

  13. TkCanvas 创建和操作画布小工具。

  14. TkScale 创建和操作缩放小工具。

  15. TkText 创建和操作文本小工具。

  16. TkToplevel 创建和操作顶层小工具。

  17. TkSpinbox 创建和操作 Spinbox 小工具。

  18. TkProgressBar 创建和操作进度条小工具。

  19. Dialog Box 创建和操作对话框小工具。

  20. Tk::Tile::Notebook 在有限空间内使用笔记本元比喻显示多个窗口。

  21. Tk::Tile::Paned 显示多个子窗口,垂直或水平堆叠。

  22. Tk::Tile::Separator 显示水平或垂直分隔条。

  23. Ruby/Tk Font, Colors and Images 了解 Ruby/Tk 字体、颜色和图像

Standard Configuration Options

所有控件都具有若干不同的配置选项,这些选项通常用于控制它们的显示方式或行为方式。有哪些可用选项当然取决于控件类。

以下列出了所有标准配置选项,这些选项可适用于任何 Ruby/Tk 控件。

Ruby/Tk Geometry Management

几何管理处理根据要求对不同控件进行定位。Tk 中的几何管理依赖于主控件和从控件的概念。

主控件是一个控件,通常是顶级窗口或框架,它将包含其它控件,即从控件。你可以认为几何管理器控制了主控件,并决定在其中显示什么。

几何管理器将询问每个从控件的自然大小,或理想的显示大小。然后,它获取该信息,并将其与程序在要求几何管理器管理该特定从控件时提供的任何参数结合在一起。

有三个几何管理器,即 place、grid 和 pack,它们负责控制接口中每个控件的大小和位置。

  1. grid 以网格排列控件的几何管理器。

  2. pack 在腔的边缘周围打包的几何管理器。

  3. place 用于固定或弹性纸页放置的几何管理器。

Ruby/Tk Event Handling

Ruby/Tk 支持事件循环,它会从操作系统接收事件。这些事件包括按钮按下、击键、鼠标移动、窗口大小调整等。

Ruby/Tk 可用于管理此事件循环。它会弄清楚该事件适用于哪个控件(用户是否单击了此按钮?如果按下了键,哪个文本框具有焦点?),并相应地分派事件。单个控件知道如何响应事件,因此例如,当鼠标移动到按钮上时,按钮可能会变色,而在鼠标离开时恢复原色。

在更高的层面上,Ruby/Tk 会在你的程序中调用回调,以表明控件发生了重大事件。对于这两种情况,你可以提供一个代码块或一个 Ruby Proc 对象,以指定应用程序如何响应该事件或回调。

让我们了解如何使用 bind 方法将基本窗口系统事件与处理它们的 Ruby 过程关联起来。bind 的最简单形式使其输入一个指示事件名称的字符串和一个 Tk 用于处理该事件的代码块。

例如,要捕获控件上的第一个鼠标按钮的 ButtonRelease 事件,你可以编写 −

someWidget.bind('ButtonRelease-1') {
   ....code block to handle this event...
}

事件名称可以包括其他修饰符和详细信息。修饰符是一个字符串,如 Shift、Control 或 Alt,指示按下了其中一个修饰键。

因此,例如,要捕获在用户按住 Ctrl 键并单击鼠标右键时生成的事件。

someWidget.bind('Control-ButtonPress-3', proc { puts "Ouch!" })

当用户激活它们时,许多 Ruby/Tk 控件都会触发回调,并且你可以使用 command 回调指定在这种情况下调用某个代码块或过程。如前所述,你可以在创建控件时指定 command 回调过程 −

helpButton = TkButton.new(buttonFrame) {
   text "Help"
   command proc { showHelp }
}

或者,你可以在稍后使用控件的 command 方法分配它 −

helpButton.command proc { showHelp }

由于 command 方法接受过程或代码块,因此你还可以编写上一段代码示例,如下所示 −

helpButton = TkButton.new(buttonFrame) {
   text "Help"
   command { showHelp }
}

The configure Method

配置方法可用于设置和检索任何小组件配置值。例如,如需更改按钮的宽度,你可以随时按如下方式调用配置方法:

require "tk"

button = TkButton.new {
   text 'Hello World!'
   pack
}
button.configure('activebackground', 'blue')
Tk.mainloop

如需获取当前小组件的值,只需按如下方式提供该值,而无需提供实际值:

color = button.configure('activebackground')

你还可以不提供任何选项来调用配置,这样便会提供所有选项及其值的列表。

The cget Method

对于单纯检索选项的值,配置会返回比你通常所需信息还多的信息。cget 方法仅返回当前值。

color = button.cget('activebackground')