📜  Ruby-Tk指南

📅  最后修改于: 2020-10-16 06:05:26             🧑  作者: Mango


介绍

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

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

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

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

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

  • 有三个几何管理器;负责控制界面中每个小部件的大小和位置的位置,网格包装

安装

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

Mac和Linux用户可能不需要安装它,因为很有可能已经将其与OS一起安装,但是如果没有,则可以下载预构建的软件包或从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

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

如果您运行此脚本,它将产生以下结果-

Ruby / Tk Hello World

Ruby / Tk窗口小部件类

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

标准配置选项

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

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

Ruby / Tk几何管理

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

主控是一个小部件,通常是顶层窗口或框架,其中将包含其他称为从属的小部件。您可以将几何图形管理器视为控制主窗口小部件,并确定将在其中显示什么。

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

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

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

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

  • 放置几何图形管理器以进行固定或橡胶板放置。

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

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

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

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