gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:14:54 25 4
gpt4 key购买 nike

我可以获取一个 Tcl 脚本,然后像这样从所述脚本运行一个 proc:

import Tkinter
>>> tclsh = Tkinter.Tcl()
>>> tclsh.eval('source {myscript.tcl}')
>>> tclsh.eval('myproc')
...[output of proc]
>>>

但是,如果我想将变量传递给此 proc,我必须这样做(假设 procdict 作为参数:

>>> tclsh.eval('dict set spec num 10000')
>>> tclsh.eval('dict set spec time 10000')
>>> tclsh.eval('dict set spec rate 10')

是否有更简单、更 Pythonic 的方式从 Tkinter 的上下文中做到这一点?我看过 variable classes ,但它们似乎没有 dict 样式的变量,甚至根本没有绑定(bind)到代码的 Tcl 解释器部分。

最佳答案

变量类是个好主意,但没有可用的特定 dict 版本,这有点难看,但您可以简单地使用字符串版本(因此会降低性能,但这是可以修复的) .

所以首先是简单的方法。 Tcl dict 有一个字符串表示,并且可以自动转换为它的字符串表示,所以如果你有一个需要 dict 的 proc,你可以简单地为 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 只是缺少 _tkinter.c 模块中的一些转换函数(参见 AsObj/FromObj/CallArgs)如果一个为映射添加了适当的代码(微不足道),您可以简单地执行此操作并完成(而且速度相当快):

interp.call("myproc", d)

在阅读了 Tcl dict C API 手册页和 Python 映射 C-API(https://www.tcl.tk/man/tcl8.6/TclLib/DictObj.htmhttps://docs.python.org/2/c-api/mapping.html)后,modules/_tkinter.c 的补丁应该非常简单。

关于python - 将 Python 变量传递给 `Tkinter.Tcl().eval()`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25288972/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com