Ruby/TK - 菜单小部件


描述

菜单是一个小部件,它显示排列在一列或多列中的单行条目的集合。存在多种不同类型的条目,每种类型具有不同的属性。不同类型的条目可以组合在一个菜单中。菜单条目与条目小部件不同。事实上,菜单项甚至不是不同的小部件;而是不同的。整个菜单就是一个小部件。

首次创建时,新列表框没有元素。可以使用提供的方法添加或删除元素。另外,可以从列出的项目中选择一个或多个元素。

不必将所有元素同时显示在列表框窗口中。列表框允许使用标准xscrollcommandyscrollcommand选项在两个方向上滚动。

句法

这是创建此小部件的简单语法 -

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

类型 => 字符串

此选项可以是menubarTearoffNormal之一,并在创建菜单时设置。

操作菜单

有多种方法可以使用菜单 -

  • activate (index)方法用于将index指示的条目的状态更改为活动状态,并使用其活动颜色重新显示它。

  • add (type, ?option, value, option, value, ...?)方法用于将新条目添加到菜单底部。新条目的类型由type给出,并且必须是cascadecheckbuttoncommandradiobuttonseparator之一,或者是上述其中一项的唯一缩写。

  • delete (index1?, index2?)方法用于删除index1和index2 之间的所有菜单项(包括index1和index2)。如果省略index2则默认为index1

  • index (index)方法返回与index 相对应的数字索引,如果将index指定为none则返回 None

  • insert (index, type?, option=>value, ...?)方法与add方法相同,不同之处在于它将新条目插入到由index给出的条目之前,而不是附加到菜单末尾。type 、optionvalue参数add widget 方法具有相同的解释。

  • invoke (index)方法用于调用菜单项的操作。

  • post (x, y)方法用于安排菜单显示在屏幕上 x 和 y 给定的根窗口坐标处。

  • postcascade (index)方法发布与index给定的级联条目关联的子菜单,并取消发布任何先前发布的子菜单。

  • type (index)方法返回由index给出的菜单项的类型。这是创建条目时传递给add widget 方法的类型参数,例如commandseparator,或者用于撕下条目的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

这将产生以下结果 -

Ruby/Tk 菜单
ruby_tk_guide.htm