Tk框架:如何停用公开事件的内部处理程序?

时间:2016-09-27 15:54:58

标签: tcl tk

我想使用Cairo C / X11代码绘制到Tk 8.6 Update()。我发现通过将frame作为选项传递给-background "",我可以阻止帧在Expose事件(例如窗口大小更改)的情况下重绘自身(所以基本上frame没有知道要重绘的内容。两个问题:

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

  • 我可以在C级别上替换Tk的内部事件处理程序(对于Expose等)吗? (目前我正在frame在Tcl级别上这样做。)

感谢您的帮助!

bind $frame <Expose> "myExposeHandler..."选项似乎无效,顺便说一句。)

1 个答案:

答案 0 :(得分:2)

-background ""选项是禁用重绘帧的选项,通常用于将帧的XId作为句柄移交到其他进程的句柄。 (这曾经是人们如何整合视频播放器;我不知道它仍然是多么实用。)正如您所发现的那样,还有-container true选项,但这仅用于您要去的地方从框架内的另一个Tk进程嵌入一个顶层(它启用了一个特殊的协议来交换几何管理器信息,IIRC),这不是你想要的。

但是,如果您已经在使用自己的C代码,那么您也可以制作自己的小部件。然后,您将完全控制所有事件处理,并可以执行任何操作。人们在执行此操作时通常会使用square widget in the Tk sources(此处包含的时间太长)。这展示了很多关于Tk如何进行事件处理的事情,例如将更新推迟到“空闲”(即,有效地事件合并)和处理Tk的配置系统。关键是你定义了一个小部件记录,其中包含所有可配置字段以及使小部件工作所需的任何其他内容(参见Square typedef),一个选项列表描述要配置哪些位的规范以及默认值(参见optionSpecs静态声明),构造函数命令(SquareObjCmd),实例命令(SquareWidgetObjCmd),事件处理程序(SquareObjEventProc)和图形回调(SquareDisplay)。还有其他的东西,比如如何删除东西等,但我相信你会得到那些东西。然后你要做的就是为Tcl命令正常注册构造函数命令;这是扩展Tcl / Tk的任何代码的惯常做法。

这样做是一项更多工作,但它会在您的实际代码和Tcl之间建立更强大的绑定。您可以自行决定在实例命令中放置多少复杂程度; Tk自己的小部件从非常简单(messagebox小部件仅比square示例小部件稍微复杂一点)到非常复杂(canvastext都不等是非常复杂的代码片段。)