0

有没有办法知道 Tk 小部件的“类型”是什么?

例如,假设我使用tk::label命令或ttk::label命令创建了一个标签。

之后,我只有小部件的路径名,例如.l. 现在,我想知道用于构建的命令是什么.l

我需要的是一个编程解决方案,一些给定.l路径的代码可以返回命令的名称,我对Tcl解决方案,甚至是用 C 编码的 Tcl 扩展感兴趣。

一种方法是使用 proc 重命名所有小部件创建命令,将这些信息保存在某处,然后完全按照原始命令执行的操作,但此解决方案要求您知道所有可用的小部件创建命令,并且不需要考虑到用户定义的小部件(或整体的巨型小部件)。

非常感谢您的帮助。

4

1 回答 1

3

winfo class命令将告诉您小部件的类,这通常足够好(请参阅此交互式会话):

% label .tklabel;       puts [winfo class .tklabel]
Label
% ttk::label .ttklabel; puts [winfo class .ttklabel]
TLabel

请注意,您可以在创建时设置标准 Tk 顶层和 Ttk 小部件的类。这会使事情变得相当复杂。使用顶层,您可以查看是否[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>事件,以便您清理有关不再存在的小部件的信息,这只会增加更多的技巧)。

于 2013-03-10T17:30:20.850 回答