参考资料:http://noyesno.net/page/82
1. 什么是Tcl/Tk/Tix
Tcl是"Tool Command Language"的缩写,是一种解释型的脚本语言。Tcl的特殊之处在于Tcl解释器可以嵌入到C/C++程序中。Tcl有一个解释器的C语言函数库,可以通过调用这些函数在应用程序中实现Tcl的特性。正是因为有这个解释器的接口,Tcl可以与C混合编程,可以用C语言扩展Tcl的命令,而且C中的变量和Tcl中的变量可以互相访问。在第5部分将演示这一功能。因此,在EDA工具中,一般都集成了Tcl环境。
Tk是建立在Tcl语言基础上的窗口系统的程序包,Tk扩展了Tcl的指令,可以很容易的建立图形界面。Tk包括了实现图形界面的最基本单元如按钮、滚动条等。同样,Tk也可以集成到C语言中,也可以通过C来扩展Tk的功能。
Tix是Tk的扩展,是建立在Tk上的更高层的程序包,可以实现如文件选择对话框之类的操作。Tix也可以与C语言集成。
在Red Hat Linux中包含了Tcl, Tk, Tix套件。这些包的位置在:
/usr/share/tcl**
/usr/share/tk**
/usr/share/tixwish**
在命令行下,可以通过tclsh, wish, tixwish***来启动tcl, tk, tix解释器。
2. Tcl语法介绍
这里只对语法做简单介绍,其他可以参考[1]
Tcl实际上是面向字符串的语言,因此Tcl中的所有变量可以认为是字符串变量。为变量赋值:
% set a 4
4
% set b 5
5
在变量前加上$符号是引用这一变量。
因为所有变量都是字符串变量,所以以下语句是错误的、
% c = $a + $b
ambiguous command name "c": case catch cd clock close concat continue
正确的方式应该是:
% set c [expr $a+$b]
这里expr是求解$a+$b这一表达式的值。[]表示将expr的结果作为一个变量赋给c。
3. 用Tk构建图形界面
键入命令wish, 启动Tk解释器,会出现一个窗口,并出现%命令提示符。
以下给出几个例子并给出简单说明:
#!/usr/bin/wish -f
proc ad {a b} {
set res [expr $a + $b]
return $res
}
entry .a -width 6 -relief sunken -textvariable a
label .l1 -text "add"
entry .b -width 6 -relief sunken -textvariable b
label .l2 -text "is"
label .resul -textvariable result
button .bu1 -text compute
pack .a .l1 .b .l2 .resul .bu1 -side left -padx 1m -pady 2m
bind .bu1 <1> {set result [ad $a $b]}
这里proc定义了一个Tcl语言过程ad,输入参数为a, b,返回res。
这里entry定义了一个输入框,Tk的图形界面实际上是一个层次化的结构,这个层次化结构的根节点是.,因此.a表示的是跟下面的一个entry。同样.menubar.menu1表示的是菜单条中的一个菜单。-width指定了这个框的宽度为6,-relief指定了框的外观为sunken, -textvariable a指定这一个框对应一个字符串类型的变量a。label定义的是一个显示在图形界面中的字符串。这个字符串是"add"。button定义了一个按钮,这个按钮上的字符显示为"compute"。最后pack将这些对象显示到窗口中。-side left表示左对齐,-padx 1m -pady 2m表示x,y两个方向图形对象与边界的间距是1毫米和2毫米。
最后一句bind是表示事件的链接,这里意思是将.bu1的<l>事件对应到执行{set result [ad $a $b]}命令。<l>表示的是鼠标左键单击事件。这里在.bu1上单击左键,会更新result的值。ad $a $b是对ad过程的调用。
将上面的例子写入一个文件ex1.tcl,并chmod +x ex1.tcl,可以直接在命令行执行
$./ex1.tcl
4. 用Tix构建图形界面
在工作站上可以通过tixwish8.1.8.3来启动tix,会出现与tk同样的界面和提示符
下面是一个简单的例子:
#!/usr/bin/tixwish8.1.8.3
tixControl .tt -label Number: -max 100 -min 0
.tt config -integer true -step 1
pack .tt
同样可以在命令行执行这一脚本。这里不再多作解释,可以参考/usr/share/doc/tix-8.1.4/docs/tix-book/tix.book.html
5. Tcl/Tk/Tix与C/C++混合编程
a. 需包含的include文件:
#include <tcl.h>
#include <tk.h>
#include <tix.h>
b. link选项:
-ltcl -ltk -ltix
c. 常用函数:
Tcl_Interp * Tcl_CreateInterp(): 创建一个Tcl解释器对象。Tcl_Interp是解释器对象。
Tcl_DeleteInterp(Tcl_Interp *interp): 删除Tcl解释器对象。
Tcl_Init(): 初始化Tcl。
Tk_Init(): 初始化Tk。
Tix_Init(): 初始化Tix。
Tcl_CreateCommand(): 通过C语言函数实现Tcl的一个命令。
Tcl_SetVar(): 设定Tcl中的变量值。
Tcl_GetVar(): 获得Tcl中的变量值。
Tcl_LinkVar(): 共享C与Tcl中的变量。
Tk_Main(): 在C语言中调用Tcl脚本的主函数。
Tcl_Eval(): 执行一个Tcl语句。
具体的参数及调用方法参考man <函数名>
d. 一个例子:
// test.c
#include <tcl.h>
#include <tk.h>
#include <stdlib.h>
#include <stdio.h>
int ad_proc(ClientData d, Tcl_Interp *interp, int argc, const char * argv[])
{
int a,b,c;
char res[20];
if(argc != 3)
{
abort();
return TCL_OK;
}
else
{
sscanf(argv[1],"%d",&a);
sscanf(argv[2],"%d",&b);
c = a+b;
sprintf(res, "%d", c);
strcpy(interp->result,res);
return TCL_OK;
}
}
int InitProc( Tcl_Interp *interp
{
int iRet;
// Initialize tk first
iRet = Tcl_Init( interp ;
if( iRet == TCL_ERROR)
{
fprintf( stderr, "Unable to Initialize Tcl: %s\n",interp->result);
return( iRet ;
} // end if
iRet = Tk_Init(interp);
if(iRet == TCL_ERROR)
{
fprintf(stderr,"Unable to Initialize TK: %s\n",interp->result);
}
// iRet = Tix_Init(interp);
// if(iRet == TCL_ERROR)
// {
// fprintf(stderr,"Unable to Initialize Tix: %s\n", interp->result);
// }
Tcl_CreateCommand(interp,"ad",ad_proc,(ClientData)0,0);
return( TCL_OK ;
} // end InitProc
int main()
{
// declare an array for two strings
char *ppszArg[2];
// allocate strings and set their contents
ppszArg[0] = (char *)malloc( sizeof( char * 20 ;
ppszArg[1] = (char *)malloc( sizeof( char * 20 ;
strcpy( ppszArg[0], "test" ;
strcpy( ppszArg[1], "./ex1.tcl";
// the following call does not return
Tk_Main( 2, ppszArg, InitProc ;
free(ppszArg);
}
这个程序调用了上一节的Tcl脚本ex1.tcl,但是通过C语言来实现其中的ad过程。因此需要在ex1.tcl将以下部分注释:
#proc ad {a b} {
# set res [expr $a + $b]
# return $res
#}
这一程序中,main函数中的Tk_Main是调用Tcl脚本的主函数。这一函数的第一个参数表示ppszArg中变量的个数,这里的ppszArg第一个元素表示调用这一程序编译后执行程序的名称,第二个元素表示要执行的tcl脚本。第三个参数是一个初始化函数的指针。Tk_Main会首先调用这一个初始化函数。这一初始化函数,通过Tcl_Init()和Tk_Init()来初始化Tcl和Tk。Tcl_Init和Tk_Init执行成功会返回TCL_OK,否则返回TCL_ERROR,错误信息在Tcl_Interp结构的result参数中。在这一初始化函数中,调用了Tcl_CreateCommand函数将ex1.tcl中的一个过程用C语言的ad_proc函数来实现。这一函数的第一个参数是Tcl解释器指针,"ad"表示Tcl中调用这一过程的调用名称,ad_proc是指向实现这一过程的C语言函数的指针,后两个参数这里为默认值(ClientData) 0和0。在ad_proc C语言函数中,其标准形式为int ad_proc(ClientData d, Tcl_Interp *interp, int argc, const char * argv[])。这里argc, argv是Tcl中调用时传过来的参数。运算结果通过Tcl_Interp *interp解释指针的result参数传回。
通过gcc -o test -ltcl -ltk -ltix test.c来编译这一程序。
e. 一个简单的Tcl/Tk解释器:
以下程序实现了一个简单的Tcl/Tk解释器:
#include <tcl.h>
#include <tk.h>
#include <stdio.h>
#include <stdlib.h>
int InitProc( Tcl_Interp *interp
{
int iRet;
// Initialize tk first
iRet = Tcl_Init( interp ;
if( iRet == TCL_ERROR)
{
fprintf( stderr, "Unable to Initialize Tcl: %s\n",interp->result);
return( iRet ;
} // end if
iRet = Tk_Init(interp);
if(iRet == TCL_ERROR)
{
fprintf(stderr,"Unable to Initialize TK: %s\n",interp->result);
}
Tcl_StaticPackage(interp, "Tk", Tk_Init, Tk_SafeInit);
return( TCL_OK ;
} // end InitProc
int main(int argc, char * argv[])
{
Tk_Main(argc, argv, InitProc ;
}
这里通过Tcl_CreateInterp函数创建一个解释器对象,并通过Tcl_Eval执行Tcl语句。Tcl_Init()和Tk_Init()函数用于初始化Tcl/Tk环境。
分享到:
相关推荐
这个“Tcl/tk软件安装包”包含了在Windows平台上运行Tcl/tk所需的所有组件。 ActiveTcl是Tcl/tk的一个流行发行版,由ActiveState公司维护。文件"ActiveTcl8.6.0.0b7.295590-win32-ix86-threaded.exe"就是ActiveTcl...
本文将详细介绍三个万能对讲机写频软件及其与TCL-HT9对讲机写频软件的关系,以及如何进行有效操作。 首先,对讲机写频软件是用于设置对讲机频道、频率、扫描列表、功率等级等参数的工具。这些参数的正确设定直接...
本文将深入解析TCL程控电话交换机BK系列的使用手册及管理软件,旨在帮助用户更好地理解和操作这一系列设备。 首先,"TCL程控电话交换机BK系列操作说明书增强版V2014"是一份详尽的指南,涵盖了从基本功能到高级设置...
《TCL拼接控制软件V2.1 20130909:电视墙维护与设置详解》 在当今的多媒体展示领域,电视墙因其震撼的视觉效果和灵活的布局方式,被广泛应用于监控中心、展览展示、广告宣传等场景。TCL作为知名的电子设备制造商,...
TCL-AF848 软件支持话费查询功能,用户可以查询话费的详细信息,包括话费的金额、时间、次数等。 六、系统设置 TCL-AF848 软件支持多种系统设置,例如,用户可以设置呼叫转移的时间和方式、账号跟随的时间和方式、...
6. **资源管理**:软件可能还包括资源管理功能,如版本控制、代码片段存储等,帮助用户更好地组织和管理他们的TCL脚本库。 在压缩包中的“tcl生成工具”很可能是该软件的安装程序或可执行文件,用户可以下载并安装...
在TCL E777这款智能手机上,CAB文件可能包含了针对该设备的特定驱动程序、系统更新、应用程序或者其他必要的软件组件。本文将深入探讨CAB文件的用途、结构以及如何在TCL E777上安装和管理这类文件。 1. CAB文件的...
【TCL智能电视安装软件工具包V3】是一款专为TCL品牌的智能电视设计的软件管理工具,旨在帮助用户更加方便、快捷地在电视上安装和管理各种应用程序。这款工具包集成了多种实用功能,包括但不限于应用下载、更新、卸载...
【TCL-HT9对讲机写频软件】是一款专为TCL-HT9型号对讲机设计的配置工具,主要用于设置和管理对讲机的各种通信参数。这款软件的重要性在于,它能够帮助用户根据实际需求定制对讲机的工作模式,提高通信效率和准确性。...
【传屏软件TCL】是一款专为TCL智能云电视设计的应用程序,它允许用户将手机或电脑上的屏幕内容无线传输到电视上,提供大屏观看体验,适用于演示、游戏、视频播放等多种场景。这款软件的使用提升了家庭娱乐和办公效率...
【TCL-S1916管理软件V2.14】是TCL公司为S1916网管交换机推出的版本号为2.14的管理程序,它专为这款设备提供了详尽的网络管理和配置功能。TCL S1916是一款具有16个局域网(LAN)接口的网管交换机,适用于中小型企业或...
《TCL-HT6对讲机写频软件详解与使用指南》 在无线电通讯领域,对讲机作为一种便捷的通信工具,被广泛应用。其中,TCL-HT6对讲机以其优良的性能和性价比受到了广大HAM(业余无线电爱好者)的青睐。然而,对于这类...
【TCL 拼接屏控制软件 矩阵】是一种专为TCL品牌拼接屏设计的专业控制系统,主要用于管理和操控多块屏幕组成的拼接显示系统。TCL灵控系统,全称为“TCL Intelligent Control System”,是这个系统的核心组成部分,它...
TCL S4108S-R3-V2配置软件包含以下几个关键方面: 1. **配置界面**:通常,这款交换机提供命令行接口(CLI)和图形用户界面(GUI)两种配置方式。CLI适合经验丰富的网络管理员,而GUI则对新手更友好,通过直观的...
而“AF88 AF100软件”可能是与TCL AF848和AF10PC相关的编程或配置工具,帮助用户安装、更新和定制交换机的系统设置,如添加新的功能、调整分机配置、设定通话规则等。 使用这类编程软件通常涉及以下几个步骤: 1. *...
Tcl/Tk软件包是一个强大的脚本语言工具集,它主要由Tcl(Tool Command Language)和Tk(Toolkit)两部分...对于BEAMnrc等相关核物理计算软件,Tcl/Tk提供了直观的用户界面,提升了用户体验,也简化了程序的使用流程。
"TCL安装第三方软件工具包2.zip"是专为TCL智能电视设计的一个实用工具,它包含了用于安装非官方应用的必要组件和指南。这个工具包适用于所有TCL电视的不同版本,无论是较早的系统还是最新的更新,都能通过此工具实现...
总的来说,TCL交换机S4108的管理软件提供了一套全面的网络管理解决方案,包括配置、监控、安全和故障处理等多个方面,旨在满足企业级网络的需求,确保网络的高效稳定运行。无论是初级还是高级网络管理员,都能通过这...