我想使用Cairo C / X11代码绘制到Tk 8.6 Update()
。我发现通过将frame
作为选项传递给-background ""
,我可以阻止帧在Expose事件(例如窗口大小更改)的情况下重绘自身(所以基本上frame
没有知道要重绘的内容。两个问题:
有没有更好的方法告诉frame
不要重绘自己,而是留给其他人?
我可以在C级别上替换Tk的内部事件处理程序(对于Expose等)吗? (目前我正在frame
在Tcl级别上这样做。)
感谢您的帮助!
(bind $frame <Expose> "myExposeHandler..."
选项似乎无效,顺便说一句。)
答案 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
示例小部件稍微复杂一点)到非常复杂(canvas
和text
都不等是非常复杂的代码片段。)