易语言和python混合编程_Python与Tcl混合编程 - 在Python中调用Tcl

本系列讨论在Python中使用Tcl脚本,以及如何使用Python对Tcl进行扩展。

==================================================================================================================================================================================================================

Python的文档对Tkinter的介绍,着重于图形界面编程,而对如何使用Tcl语言与Python代码交互,说得并不明确。本文将着重介绍如何在Python中嵌入Tcl。

1. Hello Tcl!

在Python中使用Tcl,不需要安装任何第三方模块。考虑下面一个简单的程序:

import Tkinter

interp = Tkinter.Tcl()

interp.eval('puts "Hello Tcl!"')我们首先利用TKinter.Tcl()得到一个Tcl解释器对象,然后执行它的eval方法,运行一小段Tcl代码。

然而,如果打算Tcl和Python环境有所交互,eval方法就力不从心了。

2.添加命令

利用createcommand方法将一个Python函数作为命令添加到Tcl解释器中。

下面一个例子是创建一个将所有参数数字相加的命令。

import Tkinter

import operator

interp = Tkinter.Tcl()

def SumAll(*args):

return reduce(operator.add,[int(x) for x in args])

interp.createcommand('sum_all',SumAll)

interp.eval("""puts [sum_all 1 2 3] #sum_all is a command from python""")

3. 添加和收集变量

可以在tcl代码运行前,由Python环境向Tcl解释器『注入』一些预先定义的变量。Tcl代码运行完成之后,Python环境可以获得Tcl解释器中定义的所有变量。例如:

import Tkinter

interp = Tkinter.Tcl()

interp.setvar(name='FOO', value='2')

interp.eval("""puts $FOOset BAR 3""")

print interp.getvar('BAR')

从解释器环境中删除某个标量(即相当于unset),使用interp.unsetvar(varName)

Tcl的list与Python的Tuple可相互使用。

import Tkinter

interp = Tkinter.Tcl()

interp.setvar('list_a',(1,2))

interp.eval("""puts [lindex $list_a 1] #2set v [list a b [list x y ] "c d e " " f {g h}"]""")

print interp.getvar('v') #('a', 'b', ('x', 'y'), 'c d e ', ' f {g h}')

4.追溯变量

若想让Python能够得以知晓Tcl解释器中对某个变量的操作,可利用Tcl的trace方法结合Python引入的command。(尽管Tcl本身提供了Tcl_TraceVar方法,但Tkinter不能够使用它)

import Tkinter

interp = Tkinter.Tcl()

def Tracer(varname,*args):

print interp.getvar(varname)

interp.createcommand('python_tracer',Tracer)

interp.eval("trace add variable foo write python_tracer")

interp.eval("""set foo 1set foo 2""")

由于设置了一个write trace,当对foo进行写入的时候,Python函数Tracer会得以执行。

5.获取结果

eval方法的返回值是当前表达式的值。例如:

import Tkinter

interp = Tkinter.Tcl()

interp.eval("""array set colorcount {red 1green 5blue 4white 9}""")

print interp.eval('array names colorcount') #blue white green red不要用这种方法获得简单变量以及list的值。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值