Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Python变量传递给`Tkinter.Tcl().eval())`_Python_Tkinter_Tcl - Fatal编程技术网

将Python变量传递给`Tkinter.Tcl().eval())`

将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

我可以编写一个Tcl脚本,并从所述脚本运行
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)