使用屏幕单位的选项,取值为:不带单位字母时为像素,单位字母为--c(厘米) ,i(英寸),m (毫米),p(点)。
-activebackground => color
指定激活组件的背景颜色。
-activeborderwidth => width
指定激活组件的宽度,使用屏幕单位。
-activeforeground => color
指定激活组件的前景颜色。
-anchor => anchorPos
组件的布局位置,有效值为:n, ne, e, se, s, sw, w, nw 和 center。
-background => color
组件处于正常状态时的背景颜色。
-bitmap => bitmap
指定显示在组件中的位图 ( error, gray12, gray25, gray50, gray75,
hourglass,info, questhead, question, warning, @pathName)。
-borderwidth => width
组件处于正常状态时的边界宽度,使用屏幕单位。
-command => callback
指定唤醒组件时所运行 Perl/Tk 回调过程。
-cursor => [bitmap, mask, foreground, background]
描述当鼠标指针指向组件时,光标显示状态的一个数组指针。
-disabledforeground => color
组件处于无效状态时的前景颜色。
-exportselection => boolean
指定组件的选择是否是 X 方向选择。选项取值为 true,false,0,1,yes和no。
如果选择已经导出,组件内的选择将取消当前选择,组件外的选择将取消任何组
件选择,当组件有选择时,组件响应选择。组件的默认情况是导出选择。
-font => font
组件中文本使用的字体。
-foreground => color
组件处于正常状态时的前景颜色。
-highlightbackground => color
指定组件不具有输入聚焦时它周围矩形框的颜色。
-highlightcolor => color
指定组件具有输入聚焦时它周围矩形框的颜色。
-highlightthickness => width
指定组件具有输入聚焦时它周围矩形框的宽度,使用屏幕单位。
-image => image
指定显示在组件中的图像(细节请看图像一章)。
-insertbackground => color
指定插入光标覆盖区域的背景颜色。
-insertborderwidth => width
指定插入光标边界的宽度,使用屏幕单位。
-insertofftime => milliseconds
指定在每一闪烁循环中插入光标保持“off”状态的时间,单位千分秒。
-insertontime => milliseconds
指定在每一闪烁循环中插入光标保持“on”状态的时间,单位千分秒。
-insertwidth => width
指定插入光标的宽度,使用屏幕单位。
-jump => boolean
指定附着在组件上的滚动杆和刻度盘是否延迟到鼠标键松开时才更新。
-justify => left center right
指定多线条排列时的对齐方式。 left,线条左对齐; center,线条居中对
齐;right,线条右对齐;
-orient => horizontal vertical
指定组件的布局方向,例如滚动杆可以水平布局,也可以纵向布局。
-padx => width
在 X 方向组件所需要的额外空间, 使用屏幕单位。计算所需空间时,组
件将这个数值加在正常情况所需的空间数值(由显示在组件中物件的宽度决定)
上;如果几何管理器能满足这个要求,组件将额外的内部空间用于它的左边或者
右边。大多数组件只将这个选项用于填充文本:当显示位图或图像时,忽略该选
项。
-pady => height
在 Y 方向组件所需要的额外空间,使用屏幕单位。解释参看上一条。
-relief => flat groove raised ridge sunken
指定组件边框的3-D效果。 flat, 扁平; groove,凹槽;raised,凸起;
ridge,山脊; sunken,下凹的。
-repeatdelay => milliseconds
必须在自动重复的多少时间前,按下一个按钮或按键才有效,单位千分秒。
-repeatinterval => milliseconds
动作开始后,自动重复之间的间隔时间,单位千分秒。
-selectbackground => color
指定选择项目的背景颜色。
-selectborderwidth => width
指定选择项目的宽度,使用屏幕单位。
-selectforeground => color
指定选择项目的前景颜色。
-setgrid => boolean
这个组件是否控制它的顶层窗口的调整网格。这个选项用于文本组件时很典
型,组件中的信息有天然尺寸(一个字符的尺寸),这个天然的尺寸组成一个网
格,这个选项负责使窗口的容积成为网格的整数倍。如果选项为真时,组件同窗
口管理器进行通信,当用户调整包含该组件的顶层窗口时,窗口容积以网格为单
位显示,窗口尺寸紧缩为网格单位的整数倍。
-state => actived normal disabled (用于按钮类组件)
指定组件的当前状态。
-takefocus => focusType
提供通过键盘遍历窗口(例如,Tab和Shift+Tab)时窗口的聚焦信息。在给
一个窗口设置聚焦前, 遍历脚本首先检查窗口是否可见 ;如果不可见,跳过该
窗口。 其次,检查 takefocus 选项值。如果是0,组件永远不聚焦;1,组件经
常聚焦;如果是一个空值,由 Tk 决定该窗口是否聚焦:如果窗口处于无效状态
或者没有键绑定事件则跳过该窗口; 其余情况,将 focusType 作为一个回调执
行,将组件指针作为第一表达式,返回值必须是0,1或者一个空字符串。 注意:
该解释完全由运行遍历的回调脚本定义,组件的运用完全忽略该选项,重新定义
键盘遍历脚本可以改变它的含义。
-text => string
指定显示在组件中的文本。
-textvariable => varRef
指定变量。该变量的值是显示在组件内的一个字符串;如果变量值改变,组
件自动更新以反映新值。 字符串在组件中的显示方式依赖于特定组件和受例如
anchor 和 justify 等选项决定。
-troughcolor => color
指定滚动杆和刻度盘等组件中可移动的矩形区域的颜色。
-underline => index
指定组件中用作索引的字母,该字母下划线。该选项被用于运行菜单按钮和
按钮输入遍历的默认绑定使用。0对应组件中文本的第一个字母,1对应下一个字
母,等等。
-wraplength => length
指定整字换行情形时的最大行长度。一行上超过该长度的部分换行到第二行。
使用屏幕单位。长度小于或等于0,不换行,仅在遇到换行符时才另起一行。
-xscrollcommand => callback
指定用于同水平滚动杆通信的子过程和参数。
-yscrollcommand => callback
指定用于同纵向滚动杆通信的子过程和参数。
-ipadx =>amount $widgetbecomes larger in x direction by 2 ✕ amount.
-ipady =>amount $widgetbecomes larger in y direction by 2 ✕ amount.
-padx =>amount Buffer space equal to amount is placed to left and right of widget.
-pady =>amount Buffer space equal to amount is placed on top and bottom of widget.
一、上面的众多属性中,有些属性并不是说得很清楚,先说一下,关于布局方面的属性,先上个图:
![](http://static.oschina.net/uploads/space/2014/0807/162253_xdGn_147032.png)
代码也很简单:
require 'tk'
root = TkRoot.new {
title "布局测试"
minsize(400,400)
}
TkButton.new(root) do
text "上边"
background "#ccc"
pack('side'=>'top','fill'=>'x')
end
TkButton.new do
text "下边"
background "#ccc"
pack('side'=>'bottom','fill'=>'x')
end
TkButton.new do
text "左边"
background "#ccc"
pack('fill'=>'y','side'=>'left')
end
TkButton.new do
text "右边"
background "#ccc"
pack('fill'=>'y','side'=>'right')
end
TkButton.new do
text "中间"
pack('expand'=>'1')
end
Tk.mainloop
主要涉及到三个属性,一个是fill,一个是side,一个是expand。side很简单,上下左右,但是没有“center”,不过有个expand,这个属性默认为0,表示不自动扩展。fill是填充的意思,x、y或者both,向x、y轴扩展或者向两边都扩展。
另外,再说下anchor,这个属性可取的值有以下几个:
-anchor => 'e' | 'w' | 'n' | 's' | 'ne' | 'nw' | 'se' | 'sw' | 'center'
这个nesw的全称是,east、west、north、south,所以这个东西看起来,也是做布局用的。实际上,这个属性和side还是不一样的,
Unless the -expand option is set to a true value, this won't seem to change much of anything in the window
用法如下:
TkButton.new do
text "中间"
pack('expand'=>'1','anchor'=>'nw')
end
也就是说,设置了expand这个属性后,再设置anchor,才有明显的效果。东南西北随便怎么设置都是可以的。
二、实际上,除了pack这种布局方式以外,还有另外两种方式,一种是place,另一种是grid。place用于指定组件的高度、宽度和坐标位置。用法大体如下:
place('height' => 25,'width' => 150,'x'=>130,'y'=>50)
而grid,则是通过表格行和列的方式来实现布局。用法如下:
TkButton.new(root, 'text'=>'按钮1').grid('row'=>1,'column'=>1)
TkButton.new(root, 'text'=>'按钮2').grid('row'=>2,'column'=>2)
TkButton.new(root, 'text'=>'按钮3').grid('row'=>3,'column'=>3)
TkButton.new(root, 'text'=>'按钮4').grid('row'=>1,'column'=>3)
TkButton.new(root, 'text'=>'按钮5').grid('row'=>3,'column'=>1)
总结,上面三种布局方式中,最常用的是pack,另外两种起一种补充作用,布局这种东西,只要不是用VS之类的工具去实现,相对来说都比较麻烦。JAVA SWING中也有很多种布局,甚至还出现过一些第三方布局组件。可见这并不件事容易的事,我个人认为,TK这种几种布局虽然说不上非常优秀,但只要把这几种布局方式掌握好,基本上还是够用的。