有没有办法知道Tk小部件的“类型”是什么?
举个例子,假设我使用tk::label
命令或ttk::label
命令创建标签。
之后,我只拥有窗口小部件的路径名,例如.l
。现在,我想知道用于构建.l
的命令是什么。
我需要的是程序化解决方案,给定.l
路径的一些代码可以返回命令的名称,我对 Tcl 解决方案,甚至Tcl扩展感兴趣以C编码。
执行此操作的方法可能是将所有窗口小部件创建命令重命名为使用procs将某些信息保存在某处,然后完全按照原始命令执行的操作,但此解决方案要求您知道所有可用的小部件创建命令,并没有考虑用户定义的小部件(或整个兆瓦小部件)。
非常感谢你的帮助。
答案 0 :(得分:3)
winfo class
命令将告诉您窗口小部件的类,通常足够好(请参阅此交互式会话):
% label .tklabel; puts [winfo class .tklabel]
Label
% ttk::label .ttklabel; puts [winfo class .ttklabel]
TLabel
请注意,您可以在创建时设置标准Tk toplevels和Ttk小部件的类。这可能会使事情变得相当复杂。使用toplevels,您可以看到[winfo toplevel $w] eq $w
是否为真,但这不是从8.5开始的保证测试,因为可以将其作为另一个窗口小部件的子项重新显示为或者将经典帧转换为顶层(通过wm forget
/ wm manage
)。
如果您拥有来获取用于创建窗口小部件的确切命令,唯一真正可靠的方法是捕获创建命令并记录信息,如下所示:
rename frame the_real_frame
proc frame {pathName args} {
set ::creationInfo($pathName) [list frame $args]
the_real_frame $pathName {*}$args
}
通常更容易避免这种复杂性(特别是在生产设置中,您还需要设置处理<Destroy>
事件,以便清理不再存在的小部件的信息,这只会增加更多的技巧)。