- Ruby基础
- Ruby - 首页
- Ruby - 概述
- Ruby - 环境设置
- Ruby - 语法
- Ruby - 类和对象
- Ruby - 变量
- Ruby - 运算符
- Ruby - 注释
- Ruby - IF...ELSE
- Ruby - 循环
- Ruby - 方法
- Ruby - 块
- Ruby - 模块
- Ruby - 字符串
- Ruby - 数组
- Ruby - 哈希表
- Ruby - 日期和时间
- Ruby - 范围
- Ruby - 迭代器
- Ruby - 文件I/O
- Ruby - 异常
Ruby/TK - 列表框控件
描述
一个单选按钮显示一系列单行文本项目,通常较长,并允许用户浏览列表,选择一个或多个项目。
首次创建时,新的列表框没有元素。可以使用提供的方法添加或删除元素。此外,可以从列出的项目中选择一个或多个元素。
并非所有元素都需要一次显示在列表框窗口中。列表框允许使用标准的xscrollcommand和yscrollcommand选项进行双向滚动。
语法
这是一个创建此控件的简单语法:
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 => 字符串 指定绘制活动元素的样式。这必须是dotbox、none或underline之一。默认为underline。 |
2 | height => 整数 指定窗口所需高度(以行数计)。如果为零或小于零,则窗口所需高度将足够大以容纳列表框中的所有元素。 |
3 | listvariable => 变量 指定变量的引用。变量的值是一个要在控件内显示的数组;如果变量值发生变化,则控件将自动更新自身以反映新值。 |
4 | selectmode => 字符串 指定几种操作选择的样式之一。选项的值可以是任意的,但默认绑定期望它为single、browse、multiple或extended;默认值为browse。 |
5 | state => 字符串 指定列表框的两种状态之一:normal或disabled。如果列表框被禁用,则无法插入或删除项目。 |
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选项,该选项选择四种处理选择的方式之一。
如果选择模式为single或browse,则列表框中最多只能选择一个元素。在这两种模式下,单击元素上的按钮1都会选择它并取消选择任何其他选定项目。在browse模式下,也可以使用按钮1拖动选择。
如果选择模式为multiple或extended,则可以同时选择任意数量的元素,包括不连续的范围。在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
这将产生以下结果:
示例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
这将产生以下结果:
示例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
这将产生以下结果: