- 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 - 菜单小部件
描述
菜单是一个小部件,它显示排列在一列或多列中的单行条目的集合。存在多种不同类型的条目,每种类型具有不同的属性。不同类型的条目可以组合在一个菜单中。菜单条目与条目小部件不同。事实上,菜单项甚至不是不同的小部件;而是不同的。整个菜单就是一个小部件。
首次创建时,新列表框没有元素。可以使用提供的方法添加或删除元素。另外,可以从列出的项目中选择一个或多个元素。
不必将所有元素同时显示在列表框窗口中。列表框允许使用标准xscrollcommand和yscrollcommand选项在两个方向上滚动。
句法
这是创建此小部件的简单语法 -
TkMenu.new(root) { .....Standard Options.... .....Widget-specific Options.... }
标准选项
- 活动背景
- 背景
- 禁用前景
- 宽慰
- 活动边框宽度
- 边框宽度
- 字体
- 聚焦
- 活跃前景
- 光标
- 前景
这些选项已在前一章中进行了描述。
小部件特定选项
先生。 | 选项和说明 |
---|---|
1 | 后置命令 => 字符串 如果指定了此选项,那么它会提供每次发布菜单时执行的回调。在发布菜单之前,post 方法会调用回调。 |
2 | 选择颜色 =>字符串 对于复选按钮或单选按钮的菜单项,此选项指定选择复选按钮或单选按钮时指示器中显示的颜色。 |
3 | 撕掉 => 整数 此选项必须具有正确的布尔值,该值指定菜单是否应在顶部包含可撕下的条目。如果是这样,它将作为菜单的条目 0 存在,而其他条目将从 1 开始编号。默认菜单绑定安排在调用撕下条目时将菜单撕下。 |
4 | 撕裂命令 =>字符串 如果此选项具有非空值,则它指定每当菜单被关闭时调用的 Ruby/Tk 回调。实际的命令将包含此选项的值,后跟一个空格,后跟菜单窗口的名称,再后跟一个空格,再后跟撕下的菜单窗口的名称。例如,如果选项是“a b”并且菜单 .xy 被撕掉以创建新菜单 .x.tearoff1,则将调用命令“ab .xy .x.tearoff1”。 |
5 | 标题 => 字符串 该字符串将用于为该菜单被撕下时创建的窗口添加标题。如果标题为 NULL,则窗口将具有菜单按钮的标题或调用此菜单的级联项的文本。 |
6 | 类型 => 字符串 此选项可以是menubar、Tearoff或Normal之一,并在创建菜单时设置。 |
操作菜单
有多种方法可以使用菜单 -
activate (index)方法用于将index指示的条目的状态更改为活动状态,并使用其活动颜色重新显示它。
add (type, ?option, value, option, value, ...?)方法用于将新条目添加到菜单底部。新条目的类型由type给出,并且必须是cascade、checkbutton、command、radiobutton或separator之一,或者是上述其中一项的唯一缩写。
delete (index1?, index2?)方法用于删除index1和index2 之间的所有菜单项(包括index1和index2)。如果省略index2则默认为index1。
index (index)方法返回与index 相对应的数字索引,如果将index指定为none则返回 None。
insert (index, type?, option=>value, ...?)方法与add方法相同,不同之处在于它将新条目插入到由index给出的条目之前,而不是附加到菜单末尾。type 、option和value参数与add widget 方法具有相同的解释。
invoke (index)方法用于调用菜单项的操作。
post (x, y)方法用于安排菜单显示在屏幕上 x 和 y 给定的根窗口坐标处。
postcascade (index)方法发布与index给定的级联条目关联的子菜单,并取消发布任何先前发布的子菜单。
type (index)方法返回由index给出的菜单项的类型。这是创建条目时传递给add widget 方法的类型参数,例如command或separator,或者用于撕下条目的tearoff 。
unpost方法取消窗口的映射,使其不再显示。如果发布了较低级别的级联菜单,请取消发布该菜单。返回一个空字符串。
yposition (index)方法返回一个十进制字符串,给出由index指定的条目中最顶部像素的菜单窗口内的 y 坐标。
菜单配置
默认绑定支持四种不同的使用菜单的方式 -
下拉菜单- 这是最常见的情况。您为每个顶级菜单创建一个菜单按钮小部件,并且通常在菜单栏窗口中将一系列菜单按钮排列成一行。您还可以创建顶级菜单和任何级联子菜单,并将它们与菜单按钮和级联菜单条目中的菜单选项联系在一起。
弹出菜单- 弹出菜单通常响应鼠标按钮按下或击键而发布。您创建弹出菜单和任何级联子菜单,然后在适当的时间调用Popup方法来发布顶级菜单。
选项菜单- 选项菜单由带有关联菜单的菜单按钮组成,允许您选择多个值之一。当前值显示在菜单按钮中,也存储在全局变量中。使用Optionmenu类创建选项菜单按钮及其菜单。
撕裂菜单- 您可以通过调用现有菜单顶部的撕裂条目来创建撕裂菜单。默认绑定将创建一个新菜单,该菜单是原始菜单的副本,并将其永久发布为顶级窗口。撕下的菜单与原始菜单的行为完全相同。
事件绑定
Ruby/Tk 自动为菜单创建类绑定,为菜单提供以下默认行为 -
当鼠标进入菜单时,鼠标光标下方的条目会激活;当鼠标在菜单中移动时,活动条目会发生变化以跟踪鼠标。
当鼠标离开菜单时,菜单中的所有条目都会停用,除非鼠标从菜单移动到级联子菜单的特殊情况。
当在菜单上释放按钮时,将调用活动条目(如果有)。菜单也会取消发布,除非它是撕下来的菜单。
空格键和回车键调用活动条目并取消发布菜单。
如果菜单中的任何条目具有带下划线选项的下划线字母,则按其中一个带下划线的字母(或其等效的大写或小写字母)将调用该条目并取消发布菜单。
Escape 键可中止正在进行的菜单选择,而不调用任何条目。它还会取消发布菜单,除非它是撕下来的菜单。
向上和向下键激活菜单中的下一个更高或更低的条目。当到达菜单的一端时,活动条目将绕回另一端。
向左键移动到左侧的下一个菜单。如果当前菜单是级联子菜单,则子菜单将取消发布,并且当前菜单项将成为父菜单中的级联项。如果当前菜单是从菜单按钮发布的顶级菜单,则取消发布当前菜单按钮并发布左侧的下一个菜单按钮。否则该密钥无效。菜单按钮的左右顺序由它们的堆叠顺序决定:Tk 假定最低的菜单按钮(默认情况下是第一个创建的)位于左侧。
右键移动到右侧的下一个菜单。如果当前条目是级联条目,则发布子菜单并且当前菜单条目成为子菜单中的第一个条目。否则,如果当前菜单是从菜单按钮发布的,则取消发布当前菜单按钮并发布右侧的下一个菜单按钮。
禁用的菜单项是无响应的。它们不会激活并忽略鼠标按钮的按下和释放。
例子
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
这将产生以下结果 -