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 Developer Xchange 获取源代码

简单的 Tk 应用程序

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

传统的你好,世界!Ruby/Tk 的示例看起来像这样 -

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 你好世界

Ruby/Tk 小部件类

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

标准配置选项

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

以下是所有标准配置选项的列表,可适用于任何 Ruby/Tk 小部件。

Ruby/Tk 几何管理

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

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

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

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

  • 网格几何管理器,用于在网格中排列小部件。

  • 几何管理器,包绕型腔边缘。

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

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 小部件可以在用户激活它们时触发回调,并且您可以使用命令回调来指定在发生这种情况时调用特定的代码块或过程。如前所述,您可以在创建小部件时指定命令回调过程 -

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

或者您可以稍后使用小部件的命令方法来分配它 -

helpButton.command proc { showHelp }

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

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

配置方法

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

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')