加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

[unix_tcl] TCL-TK 图形界面工具箱

(2012-01-06 15:46:58)
标签:

tcl

tk

it

分类: unix/linux

   

    tk 工具箱是一个利用 tcl 脚本语言来编写 XWindow 图形用户界面( G U I )的工具箱。tk 工具箱为tcl 语言添加了创建 GUI 组件的功能,这种 GUI 组件通常称为构件( widget )。本节主要讨论可用的tk 构件并说明如何创建它们。

 

构件的介绍

创建构件的基本方法是:

widget_type  path  option

这里的 widget_type 是下面列出的构件类型之一,path 是窗口的路径名(通常以一个圆点开始,它是根窗口的名字)option 是构件能够识别的任一选项。tk 工具箱定义的构件类型包括:

canvas 用于绘制对象

entry 用于单行文本的输入

frame 用来包含其他构件

listbox 显示一组字符串并允许对其中一个或多个字符串进行选择

menu 显示菜单条和菜单项

text 显示多行文本

label 显示单行静态文本

button 显示一个可点击按钮的构件

checkbutton 显示一个可选的方框

radiobutton 显示多个互相排斥只能单选的方框

scale 类似滚动条,它用来设置一个值

要想创建和操作构件,必须使用wish(windowing shell)。当需要交互地调用 wish 时,在 UNIX 提示符下输入wish ,此时将会出现如下 wish 提示符:

%

与此同时,在屏幕上将弹出一个空的窗口。这一窗口是 wish 的根窗口(称为.),以后创建的所有构件将随此窗口一起显示。

 

创建构件

本节说明如何创建和操作构件。首先,我们来创建一个按钮:

button .button;

这一行代码用来干什么呢?现在,我们就来解释一下。由于在这一行中指定的构件类型为 button ,因此也将创建一个按钮;这里设定的路径为 .button ,所以 tk 将在根窗口( .tk 的根窗口)中创建按钮,并把它命名为button

现在按钮在哪儿呢?此时也只是创建了按钮,按钮并没有被立即显示。为了显示按钮,需要告诉 tk 如何来显示这一构件。为此,利用 pack 命令并给出所要显示的构件的路径:

pack .button;

当运行这一命令后,按钮将被显示出来,但它却是空的(参见图3 3 - 1 ),这正是构件的选项所要派上用场的地方。

 

构件的选项

所有构件都可以使用标准的选项来控制它们的外观和功能。大多数构件可以识别如下选项:

-background color ,-bg color 构件的背景色。有效值的格式为 #RRGGBB 和 #RRRGGGBBB ,或者是 /usr/lib/X11/rgb.txt 所定义的名字之一

-foreground color ,-fg color 构件的前景色。有效值的格式为 #RRGGBB 和 #RRRGGGBBB  ,或者是 /usr/lib/X11/rgb.txt  所定义的名字之一

-height pixels :构件的高度(以像素为单位)

-width pixels 构件的宽度(以像素为单位)

-borderwidth pixels ,-db pixels 构件的边缘宽度(以像素为单位)

-padx pixels 构件在x 方向上所要求的附加空距

-pady pixels 构件在y 方向上所要求的附加空距

-relief type 构件的 3D 效果,这里的 type 是下列字符串之一:flat 、raised  、grove 、ridge 、sunken

-text string 在构件中显示的字符串

-font font 在构件中显示文本所使用的字体。有效的字体定义由命令 xlsfonts 给出

-command command 当利用构件时所执行的 tcl 命令,它通常是一个过程名或 exec 语句

 

除了上面的选项外,pack 命令还可以识别它自己的一些选项:

-side type 控制构件排放的位置。它的有效排放类型为 left 、right 、top 或 bottom 。例如,left 表示新构件应排放在现有构件的左边

-fill type 控制构件是否充满窗口所打开的空间。它的有效值为 none 、x 、y 或 both 。例如,both 表示构件应充满被打开的整个空间

-expand value 控制构件是否随着窗口大小的增加而扩大。这里的 value 或者是0 或者是1 ,

表示构件的大小随窗口的变化而变化

 

一个TCL./TK 构件的编程示例

    目前,你已经知道了有关构件和 pack 的选项,因此可以着手使用它们。构件具有的一个有趣的特性是 relief ,即构件的三维效果。为了了解每种 relief 类型的外观表现,可以利用如下命令制作一些标签:

foreach I { raised sunken flat groove ridge} {

label .$I relief $I text $I;

pack .$I

}

 

    这一例子将遍历 relief 的所有类型,对于每种类型创建一个标签,并把每个标签的 text 选项设置为相应 relief 类型的名字。在这里,有两点需要注意。第一,标签的大小不一;第二,标签的排放方式是一个放在另一个之上。这种情况是 pack 命令缺省表现形式的一个例子,pack 命令将自动确定每个构件的大小然后把每个构件放置在前一个构件的下面。

    现在,让我们来把所有的标签设置为同样的大小,并把它们并排放置,而不是一个标签压在另一个标签之上。为达到这一目的,可以有两种方法。

第一种方法是把循环改写为:

foreach I { raised sunken flat groove ridge} {

label .$I relief $I text $I height 10 width 10;

pack .$I side left

}

第二种方法是利用 configure 选项重新配置标签,configure 选项的语法是:

widget configure option

在这里,你可以利用下面的循环(在创建标签之后)

foreach I { raised sunken flat groove ridge} {

.$I configure height 10 width 10;

pack .$I side left

}

   为什么要利用 configure 呢?

   这是因为当交互运行 wish 时,如果已经提供了循环的一个版本,那么当修改并再次运行它时,将会产生下面的错误信息:

      window name "raised" already exists in parent

   通过这句话,wish  告诉程序员,他的程序试图重新创建现存的构件(在这里是标签 raised )。由于这一原因,所以需要使用 configure 。事实上,任何需要修改现有构件的情况都要求使用 configure 

在本例中,想要使用循环新版本的唯一方法是利用 destroy 命令破坏现有的标签,就像下面这样:

foreach i {raised sunken flat groove ridge} {destroy .$i}

现在让我们回到这个例子。可以看出,有两方面的问题应该解决。

一方面的问题是,标签之间相距太近,因此难以区分,另一方面的问题是:窗口的大部分是空的。通过在排放标签时填充空白并通过增加它们的边框宽度,可以使它们很容易地被区分开来。为了使标签占用全部可用的空间,可以把 pack  fill 选项设置为 both ,从而使标签在 x y 方向上都进行延伸,并且把 expand 选项设置为 true

注意为了查看 fill   expand 选项的效果,你需要重设窗口的大小,并使得标签适应窗口。通过把 lable 替换为不同类型的构件,可以很容易地对这个例子进行修改,从而使它显示出各种效果, fill  选项设置为 both,从而使标签在x y 方向上都进行延伸,并且把 expand 选项设置为 true

注意为了查看 fill   expand 选项的效果,你需要重设窗口的大小,并使得标签适应窗口。通过把 lable 替换为不同类型的构件,可以很容易地对这个例子进行修改,从而使它显示出各种效果的标签。

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有