通过 TCL 自动填充 Python 输入和调用函数

Autofilling Python input and calling functions via TCL

我已经在 Python 完成了工作的程序,但现在我被困住了。 他们要我在 TCL 中做输入,是的,所以我需要尽快解决这个问题。 TCL 脚本只会说他想调用什么函数以及他想使用什么值。 所以 TCL 脚本只会调用 Python,Python 会调用:

function.name(self)
(enter values f.e. 150, 200, 5)

并且在 Python 中只会填充函数内部的输入 (X = 150,Y = 200,超时 = 5):

def Press(self):
    self.X = int(input("X = "))
    self.Y = int(input("Y = "))
    self.timeout = int(input("How many seconds? ")
    time.sleep(self.timeout)

连接 Tcl 和 Python 的最简单方法是使用另一个的命令行 运行 调用一个。例如:

exec python -c "import foo; foo.bar(150, 200, 5)"

如果我们总结一下可能会更好:

proc callPython {module function args} {
    set pya ""
    foreach a $args {
        if {$a eq "True" || $a eq "False" || $a eq "None"} {
            # Well-known special constants
            append pya $a ","
        } elseif {[string is integer -strict $a] || [string is double -strict $a]} {
            # Numbers
            append pya $a ","
        } else {
            # Assume everything else is a string
            # This format passes pretty much arbitrary stuff
            append pya {r"""} $a {""",}
        }
    }
    # Fortunately, Python's happy about having an extra comma
    exec python -c "import $module; $module.$function($pya)"
}

另请参阅: Run function from the command line

您可以使用 tohil library 从 Tcl 调用 Python 代码。

package require tohil

tohil::exec {
    def Press(X, Y, timeout):
      print('X =', int(X))
      print('Y =', int(Y))
      print('timeout =', int(timeout))
}   

tohil::call Press 150 200 5

如果您将 Python 代码转换为模块,您可以简单地执行以下操作:

package require tohil

tohil::import foo 
tohil::call foo.bar 150 200 5

反过来也是可能的(从 Python 调用 Tcl 代码)。有关详细信息,请参阅 tohil 文档。

如果您的主程序是 Python 并且您想 运行 在 Python 中使用 Tcl 脚本,那么可以使用 _tkinter,例如

import _tkinter as _tk

s = """
puts "put your Tcl script in here"
"""
tcl = _tk.create()
tcl.call('eval',s)

tcl.setvar()tcl.getvar()可以用来连接Python和Tcl之间的变量。

所以这与 Tcl 中 运行ning Python 的逆过程已得到解答。 (只是为了兴趣而输入这个答案)