使用tkinter时如何将tcl从tcl变为python字符串变量?

时间:2009-11-18 11:35:07

标签: python tcl tkinter

我有以下python代码......

import Tkinter

root = Tkinter.Tk()

root.tk.eval('puts {printed by tcl}')

将“由tcl打印”打印到屏幕上。如何捕获tcl解释器打印到屏幕上的内容为python字符串。

这是我正在做的事情的简化示例。我有一个用python编写的自动化系统,但是一个由tcl api控制的新设备。每个tcl命令打印“连接”或“连接失败”之类的东西,我需要能够将它们捕获到python字符串中,因此自动化系统可以告诉发生了什么,例如,如果设备没有连接自动化系统可以重试连接命令。

干杯

来自尼克

1 个答案:

答案 0 :(得分:4)

如果您运行的代码打印到屏幕,并且您使用root.tk.eval()调用它,则无法捕获它。但是,您可以重新定义tcl代码中的“puts”,并让它做任何您想做的事情。这是Tcl之美的一部分 - 没有保留的话。

只需在tcl解释器中创建名为“puts”的proc,但要确保它具有完全相同的接口(即:尊重“-nonewline”,可以写入文件等)。当put通常打印到屏幕上时,你可以改为让它做你想做的任何事情,例如写入套接字或只返回它应该打印的字符串。

粗略地(未经测试,并忽略-nonewline的情况):

root.tk.eval('''
rename puts original_puts 
proc puts {args} {
    if {[llength $args] == 1} {
        return "=> [lindex $args 0]"
    } else {
        eval original_puts $args
    }
}
''')

foo = root.tk.eval('puts "hello, world"')
print foo
=> hello, world

需要稍加努力以确保您不会破坏需要标准“put”语句的tcl代码,但这并不难。只要确保你有一个参数的特殊情况,第一个参数是“-nonewline”,哪里有两个参数(文件描述符和字符串)。

如果你调用eval并且它执行两个put语句,或者执行put和然后一些其他代码,它可能会变得复杂,因为eval的结果是最后一个语句的结果。但是,您可以通过将缓冲区的输出缓冲到全局变量然后在每次执行eval时返回该变量的结果来解决这个问题。

所以,在盒子外思考一下,你就可以找到解决方案。 Tcl非常灵活。