Tcl Tk框架:如何停用暴露事件的内部处理程序?

Tcl Tk框架:如何停用暴露事件的内部处理程序?,tcl,tk,Tcl,Tk,我想使用cairoc/X11代码绘制TK8.6框架。我发现我可以通过将-background”“作为选项传递到帧(因此基本上帧不知道要重画什么)来防止帧在发生暴露事件(例如窗口大小更改)时重画自身。两个问题: 有没有更好的方法告诉帧不要重新绘制自己,而是将其留给其他人 我是否可以在C级用自己的事件处理程序替换Tk的内部事件处理程序(用于公开等)?(目前,我正在通过bind$frame“myExposeHandler…”在Tcl级别上执行此操作。) 谢谢你的帮助 (顺便说一句,-contain

我想使用cairoc/X11代码绘制TK8.6
框架。我发现我可以通过将
-background”“
作为选项传递到
(因此基本上
不知道要重画什么)来防止帧在发生暴露事件(例如窗口大小更改)时重画自身。两个问题:

  • 有没有更好的方法告诉
    不要重新绘制自己,而是将其留给其他人

  • 我是否可以在C级用自己的事件处理程序替换Tk的内部事件处理程序(用于公开等)?(目前,我正在通过
    bind$frame“myExposeHandler…”在Tcl级别上执行此操作。

谢谢你的帮助


(顺便说一句,
-container yes
选项似乎没有效果)

-background”“
选项是一个禁用帧重画的选项,通常用于将帧的XId作为句柄移交给其他进程的情况。(这曾经是人们集成视频播放器的方式;我不知道这还有多实际。)正如您所发现的,还有
-container true
选项,但它仅用于将另一个Tk进程的顶层嵌入到帧中的情况(它启用了一个用于交换几何体管理器信息的特殊协议IIRC),而这并不是您想要的

但是,如果您已经在使用自己的C代码,那么您也可以制作自己的小部件。这样,您就可以完全控制所有事件处理,并且可以做任何您想做的事情。人们通常从(太长,无法包含在此处)开始操作。这演示了Tk如何处理事件的许多事情,例如将更新延迟到“空闲”(即有效的事件合并)和处理Tk的配置系统。关键是您定义了一个小部件记录,其中包含所有可配置字段以及使小部件在其中工作所需的任何其他内容(请参阅
Square
typedef)、描述要配置的位和默认值的选项规范列表(请参阅
optionSpecs
静态声明)、构造函数命令(
SquareObjCmd
)、实例命令(
SquareWidgetObjCmd
),事件处理程序(
SquareObjEventProc
)和一个绘图回调(
SquareDisplay
)。还有其他一些位,比如如何删除东西等等,但我相信你会掌握这些技巧。然后,你所要做的就是注册构造函数命令作为Tcl命令的常规命令;这对于任何扩展Tcl/Tk的代码来说都是常见的


这样做需要更多的工作,但它将使您的实际代码和Tcl之间的绑定更加健壮(相对于极其复杂的(
canvas
text
都是非常复杂的代码片段,
messagebox
小部件只比
square
示例小部件稍微复杂一些).

容器yes
用于与toplevels上的
-use
选项集成,允许另一个进程中的toplevel包含在小部件中。这绝对不是您想要的。