Ruby/TK - Menu 菜单小部件

说明

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

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

不必一次将所有元素都显示在列表框窗口中。 列表框允许使用标准的 xscrollcommandyscrollcommand 选项双向滚动。

语法

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

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

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


操作菜单

有多种方法可以操作菜单 −

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

  • add(type, ?option, value, option, value, ...?) 方法用于在菜单底部添加一个新条目。 新条目的类型由 type 给出,并且必须是 cascadecheckbuttoncommand 之一 单选按钮,或分隔符,或上述之一的唯一缩写。

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

  • index(index) 方法返回对应于 index 的数字索引,如果 index 被指定为 none,则返回 none .

  • insert(index, type?, option=>value, ...?) 方法与 add 方法相同,只是它在 index 给出的条目,而不是附加到菜单的末尾。typeoptionvalue 参数与 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

这将产生以下结果 −

Ruby/Tk Menu

❮ Ruby Tk 指南