我试图在我的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。
答案 0 :(得分:0)
总是从全局命名空间的上下文中调用回调脚本(除了您没有使用的跟踪)。他们看不到上面的任何堆栈帧。这是因为它们有时被称为不受控制;没有人知道实际的堆栈是什么,所以它被迫进入一个已知状态。
但是,画布(和其他小部件)也在全局命名空间中具有名称。你的回调肯定是可以访问它们,只要小部件没有被销毁,并且可能确实有效。您恰好已经为它创建了一个空的坐标列表,这通常不适用于画布项目。
由于您使用的是非阻塞I / O,因此需要注意gets
在读取不完整的行时可能会返回空字符串。使用fblocked
确定是否发生了部分阅读;如果是这样,数据就在Tcl一侧的缓冲区中等待线路的其余部分出现,通常最好只是进入休眠状态并等待下一个事件触发。
如果C程序处于完全缓冲模式,那么整个问题可能会引发一些问题。在将输出从C写入管道时,默认情况下为true。在Tcl端设置缓冲不会影响它;你需要在C端使用setvbuf
,或者插入常规的fflush
个电话,或者使用Expect(它假装是一个交互式目的地,虽然交易的复杂性要花很多钱),甚至是unbuffer
(如果你能找到副本)。