Ruby/TK - Menu 菜单小部件
说明
menu 是一个小部件,它显示排列在一列或多列中的单行条目的集合。 存在几种不同类型的条目,每种条目具有不同的属性。 不同类型的条目可以组合在一个菜单中。 菜单条目与条目小部件不同。 事实上,菜单条目甚至不是不同的小部件。 整个菜单是一个小部件。
首次创建时,新列表框没有元素。 可以使用提供的方法添加或删除元素。 此外,可以从列出的项目中选择一个或多个元素。
不必一次将所有元素都显示在列表框窗口中。 列表框允许使用标准的 xscrollcommand 和 yscrollcommand 选项双向滚动。
语法
这是创建此小部件的简单语法 −
TkMenu.new(root) { .....Standard Options.... .....Widget-specific Options.... }
标准选项
- activebackground
- background
- disabledforeground
- relief
- activeborderwidth
- borderwidth
- font
- takefocus
- activeforeground
- cursor
- foreground
这些选项已在前一章中描述。
小部件特定选项
序号 | 选项 & 描述 |
---|---|
1 | postcommand => String 如果指定了这个选项,那么它会在每次发布菜单时提供一个回调来执行。 回调在发布菜单之前由 post 方法调用。 |
2 | selectcolor => String 对于复选按钮或单选按钮的菜单条目,此选项指定选中复选按钮或单选按钮时指示器中显示的颜色。 |
3 | tearoff => Integer 此选项必须具有适当的布尔值,它指定菜单是否应在顶部包含可撕下的条目。 如果是这样,它将作为菜单的条目 0 存在,其他条目将从 1 开始编号。默认菜单绑定安排在调用撕下条目时撕下菜单。 |
4 | tearoffcommand => String 如果此选项具有非空值,则它指定一个 Ruby/Tk 回调,以便在菜单被撕下时调用。 实际命令将包含此选项的值,后跟一个空格,然后是菜单窗口的名称,然后是一个空格,然后是被撕下的菜单窗口的名称。例如,如果选项是"a b"并且菜单 .x.y 被撕下以创建新菜单 .x.tearoff1,则将调用命令"a b .x.y .x.tearoff1"。 |
5 | title => String 该字符串将用于为撕下此菜单时创建的窗口命名。 如果标题为 NULL,则窗口将具有菜单按钮的标题或调用此菜单的级联项的文本。 |
6 | type => String 此选项可以是 menubar、tearoff 或 normal 之一,并在创建菜单时设置。 |
操作菜单
有多种方法可以操作菜单 −
activate(index) 方法用于将由 index 指示的条目的状态更改为 active 并使用其活动颜色重新显示它。
add(type, ?option, value, option, value, ...?) 方法用于在菜单底部添加一个新条目。 新条目的类型由 type 给出,并且必须是 cascade、checkbutton、command、 之一 单选按钮,或分隔符,或上述之一的唯一缩写。
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 坐标。
菜单配置
默认绑定支持四种不同的菜单使用方式 −
下拉菜单 − 这是最常见的情况。 您为每个顶级菜单创建一个菜单按钮小部件,并且通常在菜单栏窗口中将一系列菜单按钮排列成一行。 您还可以创建顶级菜单和任何级联子菜单,并将它们与 menubuttons 中的 menu 选项和级联菜单条目联系在一起。
弹出菜单 − 弹出菜单通常响应鼠标按钮按下或击键而发布。 您创建弹出菜单和任何级联子菜单,然后在适当的时候调用 Popup 方法来发布顶级菜单。
选项菜单 − 选项菜单由一个带有关联菜单的菜单按钮组成,允许您选择多个值之一。 当前值显示在菜单按钮中,也存储在全局变量中。 使用 Optionmenu 类来创建选项菜单按钮及其菜单。
拆卸菜单 − 您可以通过调用现有菜单顶部的可拆卸条目来创建可拆卸菜单。 默认绑定将创建一个新菜单,它是原始菜单的副本,并将其永久发布为顶级窗口。 撕下的菜单的行为与原始菜单相同。
事件绑定
Ruby/Tk 自动为菜单创建类绑定,为它们提供以下默认行为 −
当鼠标进入菜单时,鼠标光标下方的条目将激活; 当鼠标在菜单中移动时,活动条目会更改以跟踪鼠标。
当鼠标离开菜单时,菜单中的所有条目都会停用,除非在鼠标从菜单移动到级联子菜单的特殊情况下。
当在菜单上释放按钮时,将调用活动条目(如果有)。 菜单也会取消发布,除非它是撕下的菜单。
Space 和 Return 键调用活动条目并取消发布菜单。
如果菜单中的任何条目有带下划线的字母并带有 underline 选项,则按下带下划线的字母之一(或其等效的大写或小写字母)将调用该条目 并取消发布菜单。
Escape 键中止正在进行的菜单选择,而不调用任何条目。 它还会取消发布菜单,除非它是撕下的菜单。
Up 和 Down 键激活菜单中下一个更高或更低的条目。 当到达菜单的一端时,活动条目环绕到另一端。
向左键移动到左侧的下一个菜单。 如果当前菜单是级联子菜单,则子菜单未发布并且当前菜单条目成为父级中的级联条目。 如果当前菜单是从菜单按钮发布的顶级菜单,则当前菜单按钮不发布,左侧的下一个菜单按钮发布。 否则密钥无效。 菜单按钮的左右顺序由它们的堆叠顺序决定: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
这将产生以下结果 −