将Python变量传递给`Tkinter.Tcl().eval())`
我可以编写一个Tcl脚本,并从所述脚本运行将Python变量传递给`Tkinter.Tcl().eval())`,python,tkinter,tcl,Python,Tkinter,Tcl,我可以编写一个Tcl脚本,并从所述脚本运行proc,如下所示: import Tkinter >>> tclsh = Tkinter.Tcl() >>> tclsh.eval('source {myscript.tcl}') >>> tclsh.eval('myproc') ...[output of proc] >>> 但是,如果我想将变量传递到此进程,我必须这样做(假设proc将dict作为参数: >>&g
proc
,如下所示:
import Tkinter
>>> tclsh = Tkinter.Tcl()
>>> tclsh.eval('source {myscript.tcl}')
>>> tclsh.eval('myproc')
...[output of proc]
>>>
但是,如果我想将变量传递到此进程,我必须这样做(假设proc
将dict
作为参数:
>>> tclsh.eval('dict set spec num 10000')
>>> tclsh.eval('dict set spec time 10000')
>>> tclsh.eval('dict set spec rate 10')
在Tkinter的上下文中,有没有一种更简单、更具Python风格的方法来实现这一点?我已经看到了,但它们似乎没有dict样式的变量,甚至根本没有与代码的Tcl解释器部分相关联。变量类是一个好主意,但是没有可用的特定dict版本,这有点难看,但您可以简单地使用尽量使用字符串版本(并因此受到性能影响,但这是可以修复的) 首先,简单的方法是:Tcl dict有一个字符串表示,可以自动从字符串表示转换到字符串表示,因此如果您有一个需要dict的进程,您只需为dict传入字符串表示,它就可以正常工作
interp = tkinter.Tcl()
myvar = tkinter.StringVar()
def pydict2tcldict(d):
return tkinter._stringify(list(d.items()))
d = {'num': 10000, 'time': 10000, 'rate': 10}
myvar.set(pydict2tcldict(d))
interp.eval("""source {myscript.tcl}
myproc $%s""" % myvar._name)
当然,通过提供一个特殊的dict变量包装器,而不是通过字符串rep的缓慢往返,您可以使事情变得更好更快,请参见变量类的实现
但从根本上讲,tkinter只是缺少了一些转换函数(请参见AsObj
/FromObj
/CallArgs
),如果为映射添加了适当的代码(琐碎),您可以简单地完成这项工作(而且速度相当快):
在阅读了Tcl dict c API手册页和Python映射c-API(and)之后,
modules/\u tkinter.c
的补丁应该非常简单。回答得很好,非常全面。谢谢
interp.call("myproc", d)