Ruby/TK - 列表框控件



描述

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

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

并非所有元素都需要一次显示在列表框窗口中。列表框允许使用标准的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 => 字符串

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

2

height => 整数

指定窗口所需高度(以行数计)。如果为零或小于零,则窗口所需高度将足够大以容纳列表框中的所有元素。

3

listvariable => 变量

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

4

selectmode => 字符串

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

5

state => 字符串

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

6

width => 整数

指定窗口所需宽度(以字符计)。如果字体宽度不统一,则使用字符“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?)方法用于查询和更改窗口小部件窗口中文本的垂直位置。

索引

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

  • 数字 - 一个十进制数字,表示文本项目中所需字符的位置。0 指的是第一个字符,1 指的是下一个字符,依此类推。

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

  • anchor - 指示选择的锚点,该锚点由selection 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_guide.htm
广告