Tk 框架:如何停用公开事件的内部处理程序?
Tk frame: how to deactivate internal handler for expose events?
我想使用 Cairo C/X11 代码绘制成 Tk 8.6 frame
。我发现我可以通过将 -background ""
作为 frame
的选项传递给 frame
(所以基本上 frame
不知道要重绘什么)。两个问题:
是否有更好的方法告诉 frame
不要重绘自己而是将其留给其他人?
我可以在 C 级别用我自己的替换 Tk 的内部事件处理程序(用于 Expose 等)吗? (目前我正在 bind $frame <Expose> "myExposeHandler..."
的 Tcl 级别上做这件事。)
感谢您的帮助!
(-container yes
选项似乎没有效果,顺便说一下。)
-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
真的是很复杂的代码片段)。
我想使用 Cairo C/X11 代码绘制成 Tk 8.6 frame
。我发现我可以通过将 -background ""
作为 frame
的选项传递给 frame
(所以基本上 frame
不知道要重绘什么)。两个问题:
是否有更好的方法告诉
frame
不要重绘自己而是将其留给其他人?我可以在 C 级别用我自己的替换 Tk 的内部事件处理程序(用于 Expose 等)吗? (目前我正在
bind $frame <Expose> "myExposeHandler..."
的 Tcl 级别上做这件事。)
感谢您的帮助!
(-container yes
选项似乎没有效果,顺便说一下。)
-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
真的是很复杂的代码片段)。