Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.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
使用tkinter时,如何将tcl中的stdout转换成python字符串变量?_Python_Tcl_Tkinter - Fatal编程技术网

使用tkinter时,如何将tcl中的stdout转换成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

我有以下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非常容易学习。一个人很容易就可以在一天左右的时间里用它编写有用的代码。