如何使用Python调用TCL过程

时间:2013-05-08 11:50:49

标签: python tkinter tcl

使用下面的代码,我可以调用Proc.tcl文件中的所有程序,但我想单独调用诸如sum或sub之类的过程,请让我知道任何其他可能调用它

我的proc文件程序,

 puts "hello"
    proc sum {a b} {

     set c [expr $a + $b]
     puts "Addition: $c "
    }




  proc sub {a b} {

     set c [expr $a - $b]
     puts "Substraction: $c "
    }

我的主文件程序,

 import Tkinter
    import os
    r=Tkinter.Tk()
    r.tk.eval('source proc.tcl')

6 个答案:

答案 0 :(得分:7)

坚持不懈:

>>> import Tkinter
>>> r = Tkinter.Tk()
>>> r.tk.eval('proc sum {a b} {set c [expr {$a + $b}]; puts "Sum $c"; return $c}')
''
>>> r.tk.eval('sum 2 5')
Sum 7
'7'

因此,在您的情况下,在获取tcl文件后,您只需执行r.tk.eval("sum 5 5")即可调用该过程。

注意:始终在tcl中包含expr表达式。如上面的例子所示。

答案 1 :(得分:5)

我不知道tcl,但这看似合乎逻辑:

import tkinter
r=tkinter.Tk()
r.tk.eval('source proc.tcl')
r.tk.eval('sum 1 2')
r.tk.eval('sub 1 2')

>>> hello
>>> Addition: 3 
>>> Substraction: -1

答案 2 :(得分:1)

如果您不需要Tkinter的强大功能,您可以稍微重新构建 proc.tcl 并通过proc致电subprocess

proc.tcl:

proc sum {a b} {
    set c [expr $a + $b]
    puts "Addition: $c "
}

proc sub {a b} {
    set c [expr $a - $b]
    puts "Substraction: $c "
}

eval $argv; # NOTE 1

caller.py:

import subprocess
import shlex

def tcl(command):
    command_line = shlex.split(command)
    output = subprocess.check_output(command_line)
    return output

print tcl('tclsh proc.tcl sum 5 8')
print tcl('tclsh proc.tcl sub 19 8')

caller.py的输出:

  

增加:13

     

减产:11

讨论

  • 注1:在Tcl脚本中,行eval $argv获取命令行中的内容并执行它。它根本不提供错误检查,因此可能存在危险。在执行命令之前,您需要检查命令行是否存在恶意。我在这里有很好的示范目的。

  • caller.py 中的函数tcl接受命令行,拆分它,并调用proc.tcl来完成工作。它收集输出并将其返回给调用者。同样,出于演示目的,我根本没有包含任何错误检查。

答案 3 :(得分:1)

使用可以使用r.eval

r.eval('source proc.tcl')
r.eval('sub {0} {1}'.format(a, b))

您应该只在proc.tcl中编写函数。puts "hello"之类的行将在使用eval进行评估时执行。

答案 4 :(得分:0)

import subprocess

r = subprocess.check_output('tclsh proc.tcl', shell=True)

答案 5 :(得分:-3)

而不是r.tk.eval(' source proc.tcl')

尝试使用os.system(' source proc.tcl')  并导入操作系统