使用tkinter时,如何将tcl中的stdout转换成python字符串变量?
我有以下python代码使用tkinter时,如何将tcl中的stdout转换成python字符串变量?,python,tcl,tkinter,Python,Tcl,Tkinter,我有以下python代码 import Tkinter root = Tkinter.Tk() root.tk.eval('puts {printed by tcl}') 它将tcl打印到屏幕上。如何将tcl解释器打印到屏幕上的内容捕获为python字符串 这是我正在做的一个简化示例。我有一个用python编写的自动化系统,但有一个由tcl api控制的新设备。每个tcl命令都会打印诸如connected或connection failed之类的内容,我需要能够将这些内容捕获到python
import Tkinter
root = Tkinter.Tk()
root.tk.eval('puts {printed by tcl}')
它将tcl打印到屏幕上。如何将tcl解释器打印到屏幕上的内容捕获为python字符串
这是我正在做的一个简化示例。我有一个用python编写的自动化系统,但有一个由tcl api控制的新设备。每个tcl命令都会打印诸如connected或connection failed之类的内容,我需要能够将这些内容捕获到python字符串中,以便自动化系统能够知道发生了什么,例如,如果设备未连接,自动化系统可以重试connection命令
干杯
从Nick开始如果您运行的代码打印到屏幕上,并且您使用root.tk.eval调用它,则无法捕获该代码。但是,您可以重新定义puts在tcl代码中的作用,并让它做任何您想做的事情。这是Tcl之美的一部分——没有保留的字眼 只需在tcl解释器中创建一个名为puts的进程,但要确保它具有完全相同的接口,即:尊重-非WLINE,可以写入文件等。当puts正常打印到屏幕上时,您可以让它执行任何您想要的操作,例如写入套接字或仅返回它应该打印的字符串 大致未经测试,忽略-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
这需要一点努力,以确保您不会破坏tcl代码,因为它需要一个标准puts语句,但这并不难做到。只需确保有一个参数的特殊情况,-nonewline的第一个参数,其中有两个参数file descriptor和string
如果调用eval并执行两条puts语句,或者执行一条puts语句,然后执行其他一些代码,则可能会变得复杂,因为eval的结果是最后一条语句的结果。但是,您可以通过将其输出放入全局变量,然后在每次执行求值时返回该变量的结果来解决此问题
所以,跳出框框思考一下,你就能找到解决办法。Tcl非常灵活。如果您运行的代码打印到屏幕上,并且您使用root.tk.eval调用它,则无法捕获该代码。但是,您可以重新定义puts在tcl代码中的作用,并让它做任何您想做的事情。这是Tcl之美的一部分——没有保留的字眼 只需在tcl解释器中创建一个名为puts的进程,但要确保它具有完全相同的接口,即:尊重-非WLINE,可以写入文件等。当puts正常打印到屏幕上时,您可以让它执行任何您想要的操作,例如写入套接字或仅返回它应该打印的字符串 大致未经测试,忽略-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
这需要一点努力,以确保您不会破坏tcl代码,因为它需要一个标准puts语句,但这并不难做到。只需确保有一个参数的特殊情况,-nonewline的第一个参数,其中有两个参数file descriptor和string
如果调用eval并执行两条puts语句,或者执行一条puts语句,然后执行其他一些代码,则可能会变得复杂,因为eval的结果是最后一条语句的结果。但是,您可以通过将其输出放入全局变量,然后在每次执行求值时返回该变量的结果来解决此问题
所以,跳出框框思考一下,你就能找到解决办法。Tcl非常灵活。您看过吗?Tcl对象有什么问题?您看过吗?Tcl对象怎么了?谢谢你的回复,我想我需要学习更多的Tcl,我主要了解python。你的答案解决了我的问题。谢谢。幸运的是,Tcl非常容易学习。一个人很容易就可以在一天左右的时间里编写出有用的代码。谢谢你的回复,我想我需要学习更多的TCL,我主要了解python。你的答案解决了我的问题。谢谢。幸运的是,Tcl非常容易学习。一个人很容易就可以在一天左右的时间里用它编写有用的代码。