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 的 ActiveTcl 下载一键式 Tk 安装程序。

Mac 和 Linux 用户可能不需要安装它,因为很有可能它已经随操作系统一起安装了,但如果没有,您可以下载预构建的软件包或从 Tcl 开发者交流 获取源代码。

简单的 Tk 应用程序

Ruby/Tk 程序的典型结构是创建主窗口或窗口(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过程关联起来。bind的最简单的形式将指示事件名称的字符串和Tk用于处理事件的代码块作为输入。

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

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

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

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

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

许多Ruby/Tk部件在用户激活它们时可以触发回调,您可以使用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方法可用于设置和检索任何部件配置值。例如,要更改按钮的宽度,您可以随时调用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')
广告