Ruby/TK - 菜单部件



描述

一个菜单是一个部件,它显示一系列单行条目,这些条目排列在一列或多列中。存在几种不同类型的条目,每种都有不同的属性。不同类型的条目可以组合在一个菜单中。菜单条目与条目部件不同。事实上,菜单条目甚至不是独立的部件;整个菜单就是一个部件。

新创建的列表框 initially 没有元素。可以使用提供的方法添加或删除元素。此外,可以选择列表项中的一种或多种元素。

并非所有元素都需要一次显示在列表框窗口中。列表框允许使用标准的xscrollcommandyscrollcommand 选项进行双向滚动。

语法

这是一个创建此部件的简单语法:

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 => 字符串

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

操作菜单

有各种方法可以操作菜单:

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

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

  • 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参数,例如commandseparator,或撕裂式条目的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

这将产生以下结果:

Ruby/Tk Menu
ruby_tk_guide.htm
广告
© . All rights reserved.