5

使用下面的代码我可以调用 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')
4

7 回答 7

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 表达式。就像我上面的例子一样。

于 2013-05-08T12:23:01.803 回答
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
于 2013-05-08T12:19:41.613 回答
1

如果您不需要 Tkinter 的强大功能,您可以稍微重构proc.tcl并调用procvia 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

调用者.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.pytcl中的函数接受一个命令行,将其拆分,然后调用 proc.tcl 来完成这项工作。它收集输出并将其返回给调用者。同样,出于演示目的,我根本没有包括任何错误检查。

于 2013-05-08T20:14:12.813 回答
0

使用可以使用r.eval

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

您应该只在proc.tcl.line 中编写函数,例如在使用 .lineputs "hello"评估时将执行eval

于 2016-01-02T11:49:31.337 回答
0
import subprocess

r = subprocess.check_output('tclsh proc.tcl', shell=True)
于 2017-05-25T18:09:25.523 回答
0

在 Caller.py 中尝试:

import tkinter
import os

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

另外,如果你想从你的 Python 文件中给出数字,改变如下:

import tkinter
import os

r = tkinter.Tk()
r.tk.evalfile('proc.tcl')
x = 1
y = 2
r.tk.eval('sum {} {}'.format(x,y))
r.tk.eval('sub {} {}'.format(x,y))
于 2021-12-05T14:30:50.687 回答
-3

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

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

于 2013-05-21T06:50:45.570 回答