通过 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 的逆过程已得到解答。 (只是为了兴趣而输入这个答案)
我已经在 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 的逆过程已得到解答。 (只是为了兴趣而输入这个答案)