-

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

Tk具有独特的区别,成为唯一的跨平台GUI。Tk在Windows,Mac和Linux上运行,并在每个操作系统上提供了原生的外观。

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

Tk应用程序遵循一个小部件层次结构,其中任何数量的小部件可以放置在另一个小部件中,而另一个小部件中的这些小部件则无限制。Tk程序中的主窗口小部件称为根小部件,可以通过创建TkRoot类的新实例来创建。

安装

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

Mac和Linux用户可能不需要安装它,因为它已经与操作系统一起安装了很多机会,但如果没有安装,则可以下载预创建的软件包或从Tcl Developer Xchange获取源代码

简单Tk应用程序

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

传统的Hello World!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

Here, after loading the tk extension module, we create a root-level frame using TkRoot.new. We then make a TkLabel widget as a child of the root frame, setting several options for the label. Finally, we pack the root frame and enter the main GUI event loop.

If you would run this script, it would produce the following result -

Ruby / Tk Hello World

Ruby/Tk Widget Classes

There is a list of various Ruby/Tk classes, which can be used to create a desired GUI using Ruby/Tk.

标准配置选项

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

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

Ruby / Tk几何管理

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

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

几何管理器将要求每个从属窗口小部件的自然尺寸,或者最理想地显示多大。然后,当它要求几何管理器管理特定的从属窗口小部件时,它将该信息与程序提供的任何参数相结合。

有三个几何管理员放置,网格,负责控制界面中每个窗口小部件的大小和位置。

Ruby / Tk事件处理

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

Ruby / Tk负责为您管理此事件循环。它会确定事件适用的窗口小部件(用户是否点击此按钮?如果按下一个键,哪个文本框有焦点?),并相应地进行调度。各个小部件知道如何响应事件,例如,当鼠标移动时,按钮可能会更改颜色,并在鼠标离开时还原。

在更高层次上,Ruby / Tk在您的程序中调用回调,以表明widget的重要性。对于任一情况,您都可以提供代码块或Ruby Proc对象,该对象指定应用程序如何响应事件或回调。

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

例如,要抓住ButtonRelease事件在某个小部件上的第一个鼠标按钮,你会写 -

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

事件名称可以包括其他修饰符和细节。修饰符是一个像ShiftControlAlt这样的字符string,表示其中一个修饰键被按下。

所以,例如,抓住当用户按住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 }
}

配置方法

配置方法可以用来设置和检索的任何小窗口配置的值。例如,要更改按钮的宽度,您可以随时调用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")