ste*_*fin 2 python tkinter tcl
我可以获取 Tcl 脚本,并proc从该脚本运行一个,如下所示:
import Tkinter
>>> tclsh = Tkinter.Tcl()
>>> tclsh.eval('source {myscript.tcl}')
>>> tclsh.eval('myproc')
...[output of proc]
>>>
Run Code Online (Sandbox Code Playgroud)
但是,如果我想将变量传递给这个过程,我必须这样做(假设将procadict作为参数:
>>> tclsh.eval('dict set spec num 10000')
>>> tclsh.eval('dict set spec time 10000')
>>> tclsh.eval('dict set spec rate 10')
Run Code Online (Sandbox Code Playgroud)
有没有一种更简单、更 Pythonic 的方法可以从 Tkinter 的上下文中做到这一点?我见过变量classes,但它们似乎没有字典风格的变量,甚至根本没有绑定到代码的Tcl解释器部分。
变量类是一个好主意,但是没有可用的特定字典版本,这有点难看,但您可以简单地使用字符串版本(并因此而受到性能影响,但这是可以修复的)。
所以先用简单的方法。Tcl 字典具有字符串表示形式,并且可以自动在其字符串表示之间进行转换,因此,如果您有一个需要字典的过程,则只需传入该字典的字符串表示即可,它就可以工作了。
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)
Run Code Online (Sandbox Code Playgroud)
当然,您可以通过提供特殊的 dict 变量包装器而不是通过字符串代表的缓慢往返来使事情变得更好更快,请参阅变量类的实现。
但从根本上说,tkinter 只是在 _tkinter.c 模块中缺少一些转换函数(请参阅AsObj// ),如果添加了适当的映射代码(微不足道),您可以简单地执行此操作并完成(并且速度相当快):FromObjCallArgs
interp.call("myproc", d)
Run Code Online (Sandbox Code Playgroud)
在modules/_tkinter.c阅读了 Tcl dict C API 手册页和 Python 映射 C-API(https://www.tcl.tk/man/tcl8.6/TclLib/DictObj.htm和https:// docs.python.org/2/c-api/mapping.html)。
| 归档时间: |
|
| 查看次数: |
2831 次 |
| 最近记录: |