Ruby - Tk 指南
简介
Ruby 的标准图形用户界面 (GUI) 是 Tk。 Tk 最初是由 John Ousterhout 开发的 Tcl 脚本语言的 GUI。
Tk 的独特之处在于它是唯一的跨平台 GUI。 Tk 在 Windows、Mac 和 Linux 上运行,并在每个操作系统上提供本机外观。
基于 Tk 的应用程序的基本组件称为小部件。 组件有时也称为窗口,因为在 Tk 中,"窗口"和"小部件"经常互换使用。
Tk 应用程序遵循一个小部件层次结构,其中任意数量的小部件可以放置在另一个小部件中,并且这些小部件在另一个小部件中,无穷无尽。 Tk 程序中的主部件称为根部件,可以通过创建 TkRoot 类的新实例来创建。
大多数基于 Tk 的应用程序都遵循相同的循环:创建小部件,将它们放置在界面中,最后将与每个小部件关联的事件绑定到方法。
共有三个几何管理器; place、grid 和 pack 负责控制界面中每个小部件的大小和位置。
安装
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 小部件类
有一个各种 Ruby/Tk 类的列表,可用于使用 Ruby/Tk 创建所需的 GUI。
TkFrame 创建和操作框架小部件。
TkButton 创建和操作按钮小部件。
TkLabel 创建和操作标签小部件。
TkEntry 创建和操作条目小部件。
TkCheckButton 创建和操作检查按钮小部件。
TkRadioButton 创建和操作单选按钮小部件。
TkListbox 创建和操作列表框小部件。
TkComboBox 创建和操作列表框小部件。
TkMenu 创建和操作菜单小部件。
TkMenubutton 创建和操作菜单按钮小部件。
Tk.messageBox 创建和操作消息对话框。
TkScrollbar 创建和操作滚动条小部件。
TkCanvas 创建和操作画布小部件。
TkScale 创建和操作比例小部件。
TkText 创建和操作文本小部件。
TkToplevel 创建和操作顶级小部件。
TkSpinbox 创建和操作 Spinbox 小部件。
TkProgressBar 创建和操作进度条小部件。
对话框创建和操作对话框小部件。
Tk::Tile::Notebook 用笔记本比喻在有限的空间内显示多个窗口。
Tk::Tile::Paned 显示多个子窗口,垂直或水平堆叠。
Tk::Tile::Separator 显示水平或垂直分隔条。
Ruby/Tk 字体、颜色和图像 了解 Ruby/Tk 字体、颜色和图像
标准配置选项
所有小部件都有许多不同的配置选项,这些选项通常控制它们的显示方式或行为方式。 当然,可用的选项取决于小部件类。
这里是所有标准配置选项的列表,它们可能适用于任何 Ruby/Tk 小部件。
序号 | 选项 & 描述 |
---|---|
1 | activebackground => String 指定绘制活动元素时使用的背景颜色。 如果鼠标光标位于元素上并且按下鼠标按钮将导致某些操作发生,则该元素是活动的。 您可以使用"red", "blue", "pink", "yellow"等颜色名称。 |
2 | activeborderwidth => Integer 指定一个非负值,指示围绕活动元素绘制的 3-D 边框的宽度。 |
3 | activeforeground => String 指定绘制活动元素时使用的前景色。 |
4 | anchor => String 指定小部件中的信息(例如文本或位图)如何在小部件中显示。 必须是 n、ne、e、se、s 值之一 、sw、w、nw 或 center。例如,nw 表示显示信息,使其左上角位于小部件的左上角。 |
5 | background or bg => String 指定显示小部件时要使用的正常背景颜色。 |
6 | bitmap => Bitmap 指定要在小部件中显示的位图。 显示位图的确切方式可能会受到其他选项(例如锚点或对齐)的影响。 |
7 | borderwidth or bd => Integer 指定一个非负值,指示要在小部件外部绘制的 3-D 边框的宽度。 |
8 | compound => String 指定小部件是否应同时显示文本和位图/图像,如果是,则位图/图像应相对于文本放置在何处。 必须是 none、bottom、top、left、right 值之一 ,或center。 |
9 | cursor => String 指定要用于小部件的鼠标光标。 可能的值可能是"watch"、"arrow"等。 |
10 | disabledforeground => String 指定绘制禁用元素时使用的前景色。 |
11 | exportselection => Boolean 指定窗口小部件中的选择是否也应该是 X 选择。 该值可以是 true、false、0、1、yes,或no。如果选择已导出,则在小部件中选择会取消选择当前 X 选择,在小部件外部选择会取消选择任何小部件选择,并且小部件将在有选择时响应选择检索请求。 |
12 | font => String 指定在小部件内绘制文本时要使用的字体。 |
13 | foreground or fg => String 指定显示小部件时要使用的正常前景色。 |
14 | highlightbackground => String 指定当小部件没有输入焦点时在遍历突出显示区域中显示的颜色。 |
15 | highlightcolor => String 指定当控件具有输入焦点时在控件周围绘制的遍历高亮矩形所使用的颜色。 |
16 | highlightthickness => Integer 指定一个非负值,指示当控件具有输入焦点时要在控件外部绘制的高亮矩形的宽度。 |
17 | image => Image 指定要在小部件中显示的图像,该图像必须是使用图像创建创建的。 通常,如果指定了 image 选项,那么它将覆盖指定要在小部件中显示的位图或文本值的其他选项; image 选项可以重置为空字符串以重新启用位图或文本显示。 |
18 | jump => String 对于具有可拖动以调整值的滑块的小部件,例如滚动条和比例尺,此选项确定何时发出有关值更改的通知。 选项的值必须是布尔值。 如果该值为 false,则在拖动滑块时不断进行更新。 如果值为 true,则延迟更新,直到释放鼠标按钮结束拖动; 此时会发出一个通知。 |
19 | justify => String 当小部件中显示多行文本时,此选项确定各行如何相互对齐。 必须是 left、center 或 right 之一。 Left 表示线条的左边缘全部对齐,center 表示线条的中心对齐,right 表示线条的右边缘对齐。 |
20 | offset => String 指定瓦片的偏移量(另见 tile 选项)。 它可以有两种不同的格式offset x,y或 offset side,其中side可以是n、ne, e、se、s、sw、w、nw< /b> 或 center。 |
21 | orient => String 对于可以以水平或垂直方向布置自己的小部件,例如滚动条,此选项指定应使用哪个方向。 必须是 horizontal 或 vertical 或其中之一的缩写。 |
22 | padx => Integer 指定一个非负值,指示在 X 方向上为小部件请求多少额外空间。 |
23 | pady => Integer 指定一个非负值,指示在 Y 方向上为小部件请求多少额外空间。 |
24 | relief => Integer 指定小部件所需的 3-D 效果。 可接受的值为 raised, sunken, flat, ridge, groove |
25 | repeatdelay => Integer 指定按钮或键在开始自动重复之前必须按住的毫秒数。 例如,用于滚动条中的向上和向下箭头。 |
26 | repeatinterval => Integer 与 repeatdelay 一起使用:自动重复开始后,此选项确定自动重复之间的毫秒数 |
27 | selectbackground => String 指定显示所选项目时要使用的背景颜色。 |
28 | selectborderwidth => Integer 指定一个非负值,指示要在选定项目周围绘制的 3-D 边框的宽度。 |
29 | selectforeground => String 指定显示选定项目时要使用的前景色。 |
30 | setgrid => Boolean 指定一个布尔值,该值确定此小部件是否控制其顶级窗口的大小调整网格。 此选项通常用于文本小部件,其中小部件中的信息具有自然大小(字符大小),并且窗口的尺寸是这些单位的整数是有意义的。 |
31 | takefocus => Integer 提供通过键盘遍历(例如,Tab 和 Shift-Tab)将焦点从一个窗口移动到另一个窗口时使用的信息。 在将焦点设置到窗口之前,遍历脚本首先检查窗口是否可见(它和它的所有祖先都已映射); 如果不是,则跳过该窗口。 值 0 表示在键盘遍历期间应完全跳过此窗口。 1 表示此窗口应始终接收输入焦点。 |
32 | text => String 指定要在小部件内显示的字符串。 字符串的显示方式取决于特定的小部件,并且可能由其他选项确定,例如 anchor 或 justify。 |
33 | textvariable => Variable 指定变量的名称。 变量的值是要在小部件内显示的文本字符串; 如果变量值发生变化,那么小部件将自动更新自身以反映新值。 字符串在小部件中的显示方式取决于特定的小部件,并且可能由其他选项确定,例如 anchor 或 justify。 |
34 | tile => Image 指定用于显示小部件的图像。 如果 image 是空字符串,则显示正常的背景颜色。 |
35 | troughcolor => String 指定用于滚动条和刻度等小部件中的矩形槽区域的颜色。 |
36 | troughtile => Image 指定用于在滚动条和刻度等小部件的矩形槽区域中显示的图像。 |
37 | underline => Integer 指定小部件中要下划线的字符的整数索引。 默认绑定使用此选项来实现菜单按钮和菜单条目的键盘遍历。 0 对应于小部件中显示的文本的第一个字符,1 对应于下一个字符,依此类推。 |
38 | wraplength => Integer 对于可以执行自动换行的小部件,此选项指定最大行长度。 |
39 | xscrollcommand => function 指定用于与水平滚动条通信的回调。 |
40 | yscrollcommand => function 指定用于与垂直滚动条通信的回调。 |
Ruby/Tk 几何管理
几何管理处理根据要求定位不同的小部件。 Tk 中的几何管理依赖于主从小部件的概念。
主控是一个小部件,通常是顶级窗口或框架,其中将包含其他小部件,这些小部件称为从属。 您可以将几何管理器视为控制主小部件并决定将在其中显示的内容。
几何管理器将询问每个从属小部件的自然大小,或者理想情况下希望显示的大小。 然后,当它要求几何管理器管理该特定从属部件时,它会获取该信息并将其与程序提供的任何参数结合起来。
三个几何管理器place、grid 和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... }
事件名称可以包含其他修饰符和详细信息。 修饰符是一个字符串,如 Shift、Control 或 Alt,表示按下了其中一个修饰键。
因此,例如,捕获当用户按住 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 } }
序号 | 标签 & 事件描述 |
---|---|
1 | "1" (one) 单击鼠标左键。 |
2 | "ButtonPress-1" 单击鼠标左键。 |
3 | "Enter" 将鼠标移到里面。 |
4 | "Leave" 将鼠标移到外面。 |
5 | "Double-1" 双击。 |
6 | "B3-Motion" 右键从一个位置拖动到另一个位置。 |
7 | Control-ButtonPress-3 右键按下 Ctrl 键。 |
8 | Alt-ButtonPress-1 让按钮与 Alt 键一起按下。 |
配置方法
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')