Ruby/TK - 输入框控件



描述

一个输入框为用户提供了一个单行文本字段,用户可以在其中输入值。这些值可以是任何东西:姓名、城市、密码、社会安全号码等等。

语法

以下是一个创建此控件的简单语法:

TkEntry.new {
   .....Standard Options....
   .....Widget-specific Options....
}

标准选项

  • 背景颜色 (background)
  • 边框宽度 (borderwidth)
  • 光标 (cursor)
  • 是否导出选择内容 (exportselection)
  • 字体 (font)
  • 前景色 (foreground)
  • 高亮背景色 (highlightbackground)
  • 高亮颜色 (highlightcolor)
  • 高亮厚度 (highlightthickness)
  • 文本对齐方式 (justify)
  • 浮雕样式 (relief)
  • 选中背景色 (selectbackground)
  • 选中边框宽度 (selectborderwidth)
  • 选中前景色 (selectforeground)
  • 是否获取焦点 (takefocus)
  • 文本变量 (textvariable)
  • 水平滚动命令 (xscrollcommand)

这些选项已在上章中进行了描述。

控件特定选项

序号 选项及描述
1

disabledbackground => 字符串

指定输入框禁用时的背景颜色。如果此选项为空字符串,则使用正常的背景颜色。

2

disabledforeground => 字符串

指定输入框禁用时的前景色。如果此选项为空字符串,则使用正常的颜色。

3

readonlybackground => 字符串

指定输入框为只读时的背景颜色。如果此选项为空字符串,则使用正常的背景颜色。

4

show => 字符串

如果指定此选项,则窗口中不会显示输入框的真实内容。相反,输入框值中的每个字符都将显示为此选项值中的第一个字符,例如“*”。例如,如果输入框用于输入密码,则此选项很有用。如果选择输入框中的字符并将其复制到其他位置,则复制的信息将是显示的内容,而不是输入框的真实内容。

5

state => 字符串

指定输入框的三种状态之一:normal(正常)、disabled(禁用)或 readonly(只读)。如果输入框为只读,则不能使用控件命令更改其值,并且即使输入焦点在控件中,也不会显示插入点;但控件的内容仍然可以选择。如果输入框被禁用,则不能更改其值,不会显示插入点,内容不可选择,并且输入框可能会以不同的颜色显示。

6

validate => 字符串

指定验证应以哪种模式运行:none(无)、focus(焦点)、focusin(获取焦点)、focusout(失去焦点)、key(按键)或all(全部)。默认为none。当您需要验证时,必须明确指定要使用的模式。

7

validatecommand => 字符串

指定当您要验证输入到输入框控件中的内容时要执行的脚本。

8

width => 整数

指定一个整数,表示所需输入框窗口的宽度,以控件字体的平均字符大小为单位。如果该值小于或等于零,则控件会选择一个足够大的尺寸来容纳其当前文本。

输入框验证

我们可以通过将validatecommand选项设置为回调来验证输入的值,该回调将根据validate选项进行评估,如下所示:

  • none - 默认值。这意味着不会进行任何验证。

  • focus - 当输入框获得或失去焦点时,将调用validatecommand。

  • focusin - 当输入框获得焦点时,将调用validatecommand。

  • focusout - 当输入框失去焦点时,将调用validatecommand。

  • key - 当编辑输入框时,将调用validatecommand。

  • all - 对所有上述情况都将调用validatecommand。

操作输入框

以下是有用的方法可用于操作输入框的内容:

  • delete(first, ?last?) - 删除输入框的一个或多个元素。First是第一个要删除的字符的索引,last是最后一个要删除的字符之后的字符的索引。如果未指定last,则默认为first+1,即删除单个字符。此命令返回空字符串。

  • get - 返回输入框的字符串。

  • icursor(index) - 将插入点显示在由index指定的字符之前。返回空字符串。

  • index(index) - 返回对应于index的数字索引。

  • insert(index, string) - 在由index指示的字符之前插入字符串的字符。返回空字符串。

  • xview(args) - 此命令用于查询和更改控件窗口中文本的水平位置。

事件绑定

Ruby/Tk自动为输入框创建类绑定,使其具有以下默认行为:

  • 单击鼠标按钮1将插入点定位在鼠标光标下方的字符之前,将输入焦点设置为此控件,并清除控件中的任何选择。使用鼠标按钮1拖动将在插入点和鼠标下的字符之间拖出选择。

  • 双击鼠标按钮1将选择鼠标下的单词,并将插入点定位在单词的开头。双击后拖动将拖出由整个单词组成的选择。

  • 三击鼠标按钮1将选择输入框中的所有文本,并将插入点定位在第一个字符之前。

  • 可以通过在按下Shift键的同时使用鼠标按钮1拖动来调整选择的末端;这将调整按下按钮1时最靠近鼠标光标的选择末端。如果在拖动之前双击按钮,则选择将以整个单词为单位进行调整。

  • 在按下Control键的同时单击鼠标按钮1将把插入点定位在输入框中,而不会影响选择。

  • 如果在输入框中键入任何正常的打印字符,它们将插入到插入点的位置。

  • 可以通过使用鼠标按钮2拖动来调整输入框中的视图。如果单击鼠标按钮2而不移动鼠标,则选择将复制到插入点位置的输入框中。

  • 如果在按下按钮1的同时将鼠标从输入框的左侧或右侧拖出,则输入框将自动滚动以显示更多文本(如果在鼠标离开窗口的一侧有更多文本在屏幕外)。

  • 向左和向右键将插入点向左或向右移动一个字符;它们还会清除输入框中的任何选择并设置选择锚点。如果在按下Shift键的同时键入向左或向右键,则插入点会移动,并且选择会扩展以包括新字符。Control-Left和Control-Right按单词移动插入点,Control-Shift-Left和Control-Shift-Right按单词移动插入点并扩展选择。Control-b和Control-f分别与向左和向右键的行为相同。Meta-b和Meta-f分别与Control-Left和Control-Right的行为相同。

  • Home键或Control-a会将插入点移动到输入框的开头,并清除输入框中的任何选择。Shift-Home会将插入点移动到输入框的开头,并将选择扩展到该点。

  • End键或Control-e会将插入点移动到输入框的末尾,并清除输入框中的任何选择。Shift-End会将插入点移动到末尾,并将选择扩展到该点。

  • Select键和Control-Space将选择锚点设置为插入点的位置。它们不会影响当前的选择。Shift-Select和Control-Shift-Space将选择调整到插入点的当前位置,如果之前没有选择,则从锚点到插入点进行选择。

  • Control-/选择输入框中的所有文本。

  • Control-\清除输入框中的任何选择。

  • F16键(在许多Sun工作站上标记为复制)或Meta-w将选择复制到剪贴板,如果存在选择。

  • F20键(在许多Sun工作站上标记为剪切)或Control-w将选择复制到剪贴板并删除选择。如果控件中没有选择,则这些键无效。

  • F18键(在许多Sun工作站上标记为粘贴)或Control-y在插入点位置插入剪贴板的内容。

  • Delete键删除选择(如果输入框中有选择)。如果没有选择,它将删除插入点右侧的字符。

  • BackSpace键和Control-h删除选择(如果输入框中有选择)。如果没有选择,它将删除插入点左侧的字符。

  • Control-d删除插入点右侧的字符。

  • Meta-d删除插入点右侧的单词。

  • Control-k删除插入点右侧的所有字符。

  • Control-w删除插入点左侧的单词。

  • Control-t反转插入点右侧的两个字符的顺序。

如果使用state选项禁用条目,则仍然可以调整条目的视图并选择条目中的文本,但不会显示插入光标,也不会进行任何文本修改。

示例

require 'tk'

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

entry1 = TkEntry.new(root)
entry2 = TkEntry.new(root) do
   show '*'
end

variable1 = TkVariable.new
variable2 = TkVariable.new
entry1.textvariable = variable1
entry2.textvariable = variable2
variable1.value = "Enter any text value"
variable2.value = "Enter any confidential value"

entry1.place('height' => 25, 'width'  => 150, 'x'   => 10, 'y'   => 10)
entry2.place('height' => 25, 'width'  => 150, 'x'   => 10, 'y'   => 40)

Tk.mainloop

这将产生以下结果 -

Ruby/Tk Entry
ruby_tk_guide.htm
广告