从fileevent

时间:2016-01-04 21:23:53

标签: tcl tk

我试图在我的Tcl / Tk脚本顶层的画布上画画,但是从像这样的fileevent调用内部:

canvas .myCanvas {}

proc plot_Data { myC inp } { $myC create rectangle {} }

fileevent $inp readable [list plot_Data .myCanvas $inp ]

pack .myCanvas

我发现fileevent(plot_Data)调用的脚本位于不同的空间。

  

文件事件的脚本在调用fileevent命令的解释器中的全局级别(在任何Tcl过程的上下文之外)执行。

我无法让两人见面。我肯定已将其缩小到这一点:plot_Data无法访问.myCanvas。问题:如何在画布上绘制文件活动脚本?

顺便提一下,目标是实时策划。 $ inp是C程序的管道,用于从测量设备读取数据。这是imho正确配置fconfigure $ inp -blocking 0 -buffering none。

1 个答案:

答案 0 :(得分:0)

总是从全局命名空间的上下文中调用回调脚本(除了您没有使用的跟踪)。他们看不到上面的任何堆栈帧。这是因为它们有时被称为不受控制;没有人知道实际的堆栈是什么,所以它被迫进入一个已知状态。

但是,画布(和其他小部件)也在全局命名空间中具有名称。你的回调肯定是可以访问它们,只要小部件没有被销毁,并且可能确实有效。您恰好已经为它创建了一个空的坐标列表,这通常不适用于画布项目。

由于您使用的是非阻塞I / O,因此需要注意gets在读取不完整的行时可能会返回空字符串。使用fblocked确定是否发生了部分阅读;如果是这样,数据就在Tcl一侧的缓冲区中等待线路的其余部分出现,通常最好只是进入休眠状态并等待下一个事件触发。

如果C程序处于完全缓冲模式,那么整个问题可能会引发一些问题。在将输出从C写入管道时,默认情况下为true。在Tcl端设置缓冲不会影响它;你需要在C端使用setvbuf,或者插入常规的fflush个电话,或者使用Expect(它假装是一个交互式目的地,虽然交易的复杂性要花很多钱),甚至是unbuffer(如果你能找到副本)。