Ruby/TK - ListBox 列表框小部件

说明

radiobutton 显示单行文本项目列表,通常很长,并允许用户浏览列表,选择一个或多个。

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

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

语法

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

TkListbox.new(root) {
   .....Standard Options....
   .....Widget-specific Options....
}

标准选项

  • background
  • borderwidth
  • cursor
  • disabledforeground
  • exportselection
  • font
  • foreground
  • hight
  • highlightbackground
  • highlightcolor
  • highlightthickness
  • offset
  • relief
  • selectbackground
  • selectborderwidth
  • selectforeground
  • setgrid
  • takefocus
  • tile
  • width
  • xscrollcommand
  • yscrollcommand

这些选项已在前一章中描述。


小部件特定选项

序号 选项 & 描述
1

activestyle => String

指定绘制活动元素的样式。 这必须是 dotboxnoneunderline 之一。 默认为underline

2

height => Integer

以行为单位指定所需的窗口高度。 如果为零或更小,则窗口的所需高度刚好足够容纳列表框中的所有元素。

3

listvariable => Variable

指定变量的引用。 变量的值是要显示在小部件内部的数组; 如果变量值发生变化,那么小部件将自动更新自身以反映新值。

4

selectmode => String

指定用于操作选择的几种样式之一。 选项的值可以是任意的,但默认绑定期望它是 singlebrowsemultipleextended ; 默认值为browse

5

state => String

指定列表框的两种状态之一:normaldisabled。 如果列表框被禁用,则可能无法插入或删除项目。

6

width => Integer

以字符为单位指定所需的窗口宽度。 如果字体没有统一的宽度,则字符"0"的宽度用于从字符单位转换为屏幕单位。 如果为零或更小,则窗口的所需宽度刚好足够容纳列表框中的所有元素。


操作列表框项

列表框有多种玩法 −

  • listvariable − 变量允许您将变量(必须包含列表)链接到列表框。 此列表的每个元素都是一个字符串,表示列表框中的一项。 因此,要在列表框中添加、删除或重新排列项目,您可以像操作任何其他列表一样简单地操作此变量。

  • insert idx item ?item... ? 方法用于向列表中添加一项或多项; "idx"是一个从 0 开始的索引,指示应在其之前添加项目的项目的位置; 指定"end"将新项目放在列表的末尾。

  • delete first ?last? 方法用于从列表中删除一个或多个项目; "first"和"last"是根据"insert"方法的索引。

  • get first ?last? 方法返回给定位置的单个项目的内容,或"first"和"last"之间的项目列表。

  • size 方法返回列表中的项目数。

  • curselection 方法用于找出用户当前选择了列表框中的哪些项目。 这将返回当前选择的所有项目的索引列表; 这可能是一个空列表。

  • selection clear first ?last? 方法用于取消选择单个项目或指定索引范围内的任何项目。

  • selection set first ?last? 方法用于选择一个项目,或一个范围内的所有项目。

  • xview(args) 方法用于查询和更改小部件窗口中信息的水平位置。

  • yview(?args?) 方法用于查询和更改小部件窗口中文本的垂直位置。


索引

列表框的许多方法都采用一个或多个索引作为参数。 索引指定列表框的特定元素,以下列任何方式 −

  • number − 一个十进制数,给出所需字符在文本项中的位置。 0 表示第一个字符,1 表示下一个字符,依此类推。

  • active − 指示具有位置光标的元素。 当列表框具有键盘焦点时,此元素将显示为带有下划线,并且使用 activate 方法指定。

  • anchor − 表示选择的锚点,使用选择锚方法设置。

  • end − 表示列表框的结束。 对于某些命令,这意味着就在最后一个元素之后; 对于其他命令,它意味着最后一个元素。


事件绑定

Ruby/Tk 为列表框创建类绑定,赋予它们类似 Motif 的行为。 列表框的大部分行为是由它的 selectmode 选项决定的,它选择四种处理选择的方式之一。

  • 如果选择方式为singlebrowse,则列表框中一次最多可以选择一个元素。 在这两种模式下,单击元素上的按钮 1 会选择它并取消选择任何其他选定的项目。 在 browse 模式下,也可以使用按钮 1 拖动选择。

  • 如果选择模式是multipleextended,则可以一次选择任意数量的元素,包括不连续的范围。在 multiple 模式下,单击元素上的按钮 1 会切换其选择状态,而不会影响任何其他元素。在 extended 模式下,按下元素上的按钮 1 会选择它,取消选择其他所有内容,并将锚点设置为鼠标下的元素; 使用按钮 1 向下拖动鼠标会扩展选择范围以包括锚点和鼠标下的元素之间的所有元素,包括在内。

大多数人可能希望使用 browse 模式进行单选,使用 extended 模式进行多选; 其他模式似乎只在特殊情况下有用。

除了上述行为之外,还有许多其他与列表框相关的附加行为,本教程不涉及这些行为 −

示例 1

require "tk"

root = TkRoot.new
root.title = "Window"
list = TkListbox.new(root) do
   width 20
   height 10
   setgrid 1
   selectmode 'multiple'
   pack('fill' => 'x')
end

list.insert 0, "yellow", "gray", "green",
  "blue", "red", "black", "white", "cyan",
  "pink", "yellow", "orange", "gray"

Tk.mainloop

这将产生以下结果 −

Ruby/Tk List Box 1

示例 2

以下是使用 listvariable 选项填充列表项的示例 −

require "tk"

$names = %w{ yellow gray green
              blue red black white cyan
              pink yellow orange gray}
$colornames = TkVariable.new($names)

root = TkRoot.new
root.title = "Window"

list = TkListbox.new(root) do
   width 20
   height 10
   setgrid 1
   listvariable $colornames
   pack('fill' => 'x')
end

Tk.mainloop

这将产生以下结果 −

Ruby/Tk List Box 2

示例 3

以下示例说明了如何使用 TkScrollbar 小部件和列表框。

require "tk"

$names = %w{ yellow gray green
              blue red black white cyan
              pink yellow orange gray}
$colornames = TkVariable.new($names)

root = TkRoot.new
root.title = "Window"

list = TkListbox.new(root) do
   listvariable $colornames
   pack('fill' => 'x')
end

list.place('height' => 150,
           'width'  => 100,
           'x'      => 10,
           'y'      => 10)

scroll = TkScrollbar.new(root) do
   orient 'vertical'
   place('height' => 150, 'x' => 110)
end

list.yscrollcommand(proc { |*args|
   scroll.set(*args)
})

scroll.command(proc { |*args|
   list.yview(*args)
}) 

Tk.mainloop

这将产生以下结果 −

Ruby/Tk List Box 3

❮ Ruby Tk 指南