- Ruby 基础
- Ruby - 首页
- Ruby - 概述
- Ruby - 环境搭建
- Ruby - 语法
- Ruby - 类和对象
- Ruby - 变量
- Ruby - 运算符
- Ruby - 注释
- Ruby - IF...ELSE
- Ruby - 循环
- Ruby - 方法
- Ruby - 块
- Ruby - 模块
- Ruby - 字符串
- Ruby - 数组
- Ruby - 哈希表
- Ruby - 日期和时间
- Ruby - 范围
- Ruby - 迭代器
- Ruby - 文件 I/O
- Ruby - 异常
Ruby/TK - 菜单部件
描述
一个菜单是一个部件,它显示一系列单行条目,这些条目排列在一列或多列中。存在几种不同类型的条目,每种都有不同的属性。不同类型的条目可以组合在一个菜单中。菜单条目与条目部件不同。事实上,菜单条目甚至不是独立的部件;整个菜单就是一个部件。
新创建的列表框 initially 没有元素。可以使用提供的方法添加或删除元素。此外,可以选择列表项中的一种或多种元素。
并非所有元素都需要一次显示在列表框窗口中。列表框允许使用标准的xscrollcommand 和 yscrollcommand 选项进行双向滚动。
语法
这是一个创建此部件的简单语法:
TkMenu.new(root) {
.....Standard Options....
.....Widget-specific Options....
}
标准选项
- activebackground
- background
- disabledforeground
- relief
- activeborderwidth
- borderwidth
- font
- takefocus
- activeforeground
- cursor
- foreground
这些选项已在上一章中进行了描述。
部件专用选项
| 序号 | 选项和描述 |
|---|---|
| 1 | postcommand => 字符串 如果指定此选项,则它提供一个回调函数,每次发布菜单时都会执行。回调函数在发布菜单之前由 post 方法调用。 |
| 2 | selectcolor => 字符串 对于作为复选框或单选按钮的菜单条目,此选项指定选中复选框或单选按钮时在指示器中显示的颜色。 |
| 3 | tearoff => 整数 此选项必须具有正确的布尔值,该值指定菜单是否应在顶部包含一个撕裂式条目。如果是,它将作为菜单的条目 0 存在,其他条目将从 1 开始编号。默认菜单绑定安排在调用撕裂式条目时撕裂菜单。 |
| 4 | tearoffcommand => 字符串 如果此选项的值非空,则它指定一个 Ruby/Tk 回调函数,每当菜单被撕裂时调用。实际命令将由此选项的值组成,后面跟着一个空格,然后是菜单窗口的名称,后面跟着一个空格,然后是撕裂式菜单窗口的名称。例如,如果选项是“a b”,并且菜单 .x.y 被撕裂以创建一个新的菜单 .x.tearoff1,则将调用命令“a b .x.y .x.tearoff1”。 |
| 5 | title => 字符串 该字符串将用于为撕裂此菜单时创建的窗口命名。如果标题为 NULL,则窗口将具有菜单按钮的标题或调用此菜单的级联条目的文本。 |
| 6 | type => 字符串 此选项可以是menubar、tearoff 或 normal 之一,并在创建菜单时设置。 |
操作菜单
有各种方法可以操作菜单:
activate(index) 方法用于将index指示的条目的状态更改为active,并使用其活动颜色重新显示它。
add(type, ?option, value, option, value, ...?) 方法用于将新条目添加到菜单底部。新条目的类型由type给出,必须是cascade、checkbutton、command、radiobutton 或 separator 之一,或上述类型之一的唯一缩写。
delete(index1?, index2?) 方法用于删除index1和index2(包括)之间所有菜单条目。如果省略index2,则默认为index1。
index(index) 方法返回与index对应的数字索引,如果index指定为none,则返回none。
insert(index, type?, option=>value, ...?) 方法与add 方法相同,只是它将新条目插入到由index给出的条目之前,而不是附加到菜单的末尾。type、option 和 value 参数的解释与add 部件方法相同。
invoke(index) 方法用于调用菜单条目的操作。
post(x, y) 方法用于安排在 x 和 y 给出的根窗口坐标处在屏幕上显示菜单。
postcascade(index) 方法发布与由index给出的级联条目关联的子菜单,并取消发布任何先前发布的子菜单。
type(index) 方法返回由index给出的菜单条目的类型。这是在创建条目时传递给add 部件方法的type参数,例如command 或 separator,或撕裂式条目的tearoff。
unpost 方法取消映射窗口,使其不再显示。如果发布了较低级别的级联菜单,则取消发布该菜单。返回空字符串。
yposition(index) 方法返回一个十进制字符串,该字符串给出由index指定的条目中窗口顶部像素在菜单窗口中的 y 坐标。
菜单配置
默认绑定支持四种不同的菜单使用方法:
下拉菜单 - 这是最常见的情况。为每个顶级菜单创建一个 menubutton 部件,通常在一行中排列一系列 menubuttons 在 menubar 窗口中。你还创建顶级菜单和任何级联子菜单,并使用menubuttons和级联菜单条目中的menu选项将它们绑定在一起。
弹出式菜单 - 弹出式菜单通常响应鼠标按钮按下或按键而发布。创建弹出式菜单和任何级联子菜单,然后在适当的时间调用Popup方法来发布顶级菜单。
选项菜单 - 选项菜单由一个 menubutton 和一个关联的菜单组成,该菜单允许你选择多个值之一。当前值显示在 menubutton 中,并存储在全局变量中。使用Optionmenu类创建选项 menubuttons及其菜单。
撕裂式菜单 - 通过调用现有菜单顶部的撕裂式条目来创建撕裂式菜单。默认绑定将创建一个新的菜单,该菜单是原始菜单的副本,并将其永久发布为顶级窗口。撕裂式菜单的行为与原始菜单完全相同。
事件绑定
Ruby/Tk 自动为菜单创建类绑定,使其具有以下默认行为:
当鼠标进入菜单时,鼠标光标下方的条目将激活;当鼠标在菜单周围移动时,活动条目会更改以跟踪鼠标。
当鼠标离开菜单时,菜单中的所有条目都将停用,但鼠标从菜单移动到级联子菜单的特殊情况除外。
当在菜单上释放按钮时,将调用活动条目(如果有)。菜单也将取消发布,除非它是撕裂式菜单。
空格键和回车键调用活动条目并取消发布菜单。
如果菜单中的任何条目都有用underline选项下划线的字母,则按下其中一个下划线字母(或其大写或小写等效项)将调用该条目并取消发布菜单。
Esc 键中止正在进行的菜单选择,而不会调用任何条目。它还会取消发布菜单,除非它是撕裂式菜单。
向上键和向下键激活菜单中下一个较高或较低的条目。当到达菜单的一端时,活动条目将环绕到另一端。
左键移动到左侧的下一个菜单。如果当前菜单是从 menubutton 发布的级联子菜单,则子菜单将取消发布,当前菜单条目将成为父菜单中的级联条目。如果当前菜单是从 menubutton 发布的顶级菜单,则当前 menubutton 将取消发布,并发布左侧的下一个 menubutton。否则,该键无效。menubuttons 的左右顺序由它们的堆叠顺序决定:Tk 假设最低的 menubutton(默认情况下是第一个创建的)在左侧。
右键移动到右侧的下一个菜单。如果当前条目是级联条目,则发布子菜单,当前菜单条目将成为子菜单中的第一个条目。否则,如果当前菜单是从 menubutton 发布的,则当前 menubutton 将取消发布,并发布右侧的下一个 menubutton。
禁用的菜单条目无响应。它们不会激活并且会忽略鼠标按钮的按下和释放。
示例
require "tk"
root = TkRoot.new
root.title = "Window"
menu_click = Proc.new {
Tk.messageBox(
'type' => "ok",
'icon' => "info",
'title' => "Title",
'message' => "Message"
)
}
file_menu = TkMenu.new(root)
file_menu.add('command',
'label' => "New...",
'command' => menu_click,
'underline' => 0)
file_menu.add('command',
'label' => "Open...",
'command' => menu_click,
'underline' => 0)
file_menu.add('command',
'label' => "Close",
'command' => menu_click,
'underline' => 0)
file_menu.add('separator')
file_menu.add('command',
'label' => "Save",
'command' => menu_click,
'underline' => 0)
file_menu.add('command',
'label' => "Save As...",
'command' => menu_click,
'underline' => 5)
file_menu.add('separator')
file_menu.add('command',
'label' => "Exit",
'command' => menu_click,
'underline' => 3)
menu_bar = TkMenu.new
menu_bar.add('cascade',
'menu' => file_menu,
'label' => "File")
root.menu(menu_bar)
Tk.mainloop
这将产生以下结果: