Ruby - Tk 指南

简介

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

Tk 的独特之处在于它是唯一的跨平台 GUI。 Tk 在 Windows、Mac 和 Linux 上运行,并在每个操作系统上提供本机外观。

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

Tk 应用程序遵循一个小部件层次结构,其中任意数量的小部件可以放置在另一个小部件中,并且这些小部件在另一个小部件中,无穷无尽。 Tk 程序中的主部件称为根部件,可以通过创建 TkRoot 类的新实例来创建。

  • 大多数基于 Tk 的应用程序都遵循相同的循环:创建小部件,将它们放置在界面中,最后将与每个小部件关联的事件绑定到方法。

  • 共有三个几何管理器; place、gridpack 负责控制界面中每个小部件的大小和位置。


安装

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

Mac 和 Linux 用户可能不需要安装它,因为它很有可能已经与 OS 一起安装,但如果没有,您可以下载预构建的软件包或从 Tcl Developer Xchange 获取源代码。


简单的 Tk 应用程序

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/Tk Hello World

Ruby/Tk 小部件类

有一个各种 Ruby/Tk 类的列表,可用于使用 Ruby/Tk 创建所需的 GUI。


标准配置选项

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

这里是所有标准配置选项的列表,它们可能适用于任何 Ruby/Tk 小部件。


Ruby/Tk 几何管理

几何管理处理根据要求定位不同的小部件。 Tk 中的几何管理依赖于主从小部件的概念。

主控是一个小部件,通常是顶级窗口或框架,其中将包含其他小部件,这些小部件称为从属。 您可以将几何管理器视为控制主小部件并决定将在其中显示的内容。

几何管理器将询问每个从属小部件的自然大小,或者理想情况下希望显示的大小。 然后,当它要求几何管理器管理该特定从属部件时,它会获取该信息并将其与程序提供的任何参数结合起来。

三个几何管理器place、gridpack 负责控制界面中每个小部件的大小和位置。

  • grid 在网格中排列小部件的几何管理器。

  • pack 围绕空腔边缘打包的几何管理器。

  • place 用于固定或橡胶板放置的几何管理器。


Ruby/Tk 事件处理

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

Ruby/Tk 会为您管理这个事件循环。 它将找出事件适用于哪个小部件(用户是否单击了此按钮?如果按下某个键,则哪个文本框具有焦点?),并相应地调度它。 单个小部件知道如何响应事件,例如,当鼠标移到按钮上时,按钮可能会改变颜色,并在鼠标离开时恢复原状。

在更高的层次上,Ruby/Tk 会在您的程序中调用回调,以指示小部件发生了重要的事情。对于任何一种情况,您都可以提供代码块或 Ruby Proc 对象来指定应用程序如何响应 到事件或回调。

让我们看看如何使用 bind 方法将基本的窗口系统事件与处理它们的 Ruby 过程相关联。 最简单的绑定形式将指示事件名称的字符串和 Tk 用于处理事件的代码块作为其输入。

例如,要捕获某个小部件上第一个鼠标按钮的 ButtonRelease 事件,您可以编写 −

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

事件名称可以包含其他修饰符和详细信息。 修饰符是一个字符串,如 ShiftControlAlt,表示按下了其中一个修饰键。

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

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

许多 Ruby/Tk 小部件可以在用户激活它们时触发 callbacks,并且您可以使用 command 回调来指定在发生这种情况时调用某个代码块或过程。 如前所述,您可以在创建小部件时指定命令回调过程 −

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

或者您可以稍后使用小部件的 command 方法分配它 −

helpButton.command proc { showHelp }

由于 command 方法接受过程或代码块,因此您还可以将前面的代码示例编写为 −

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

配置方法

configure 方法可用于设置和检索任何小部件配置值。 例如,要更改按钮的宽度,您可以随时调用 configure 方法,如下所示 −

require "tk"

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

要获取当前小部件的值,只需提供不带值的值,如下所示 −

color = button.configure('activebackground')

你也可以调用 configure 而不需要任何选项,这将为你提供所有选项及其值的列表。


cget 方法

为了简单地检索选项的值,configure 会返回比您通常想要的更多的信息。 cget 方法只返回当前值。

color = button.cget('activebackground')