Tcl 查找Tk小部件的类型

Tcl 查找Tk小部件的类型,tcl,tk,Tcl,Tk,有没有办法知道Tk小部件的“类型”是什么 例如,假设我使用tk::label命令或ttk::label命令创建了一个标签 之后,我只知道小部件的路径名,例如.l。现在,我想知道用于构建.l的命令是什么 我需要的是一个编程解决方案,一些给定.l路径的代码可以返回命令名,我对Tcl解决方案,甚至是用C编写的Tcl扩展感兴趣 实现这一点的一种方法是,使用将信息保存在某处的过程重命名所有小部件创建命令,然后完全按照原始命令执行操作,但此解决方案要求您了解所有可用的小部件创建命令,并且不考虑用户定义的小部

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

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

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

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

实现这一点的一种方法是,使用将信息保存在某处的过程重命名所有小部件创建命令,然后完全按照原始命令执行操作,但此解决方案要求您了解所有可用的小部件创建命令,并且不考虑用户定义的小部件(或整个MegaWidget)

非常感谢您的帮助。

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

注意,您可以在创建时设置标准Tk顶级和Ttk小部件的类。这会使事情变得相当复杂。使用toplevels,您可以查看
[winfo toplevel$w]eq$w
是否正确,但从8.5版开始,这不是一个保证的测试,因为可以将toplevels作为另一个小部件的子部件重新租入,或者将经典帧转换为toplevels(通过
wm forget
/
wm manage

如果必须获得用于创建小部件的确切命令,唯一真正可靠的方法是捕获创建命令并记录信息,如下所示:

rename frame the_real_frame
proc frame {pathName args} {
    set ::creationInfo($pathName) [list frame $args]
    the_real_frame $pathName {*}$args
}
通常更容易避免这种复杂性(特别是在生产环境中,您还需要设置一些东西来处理
事件,以便清理不再存在的小部件的信息,这只会增加更多的麻烦)。

该命令将告诉您小部件的类别,这通常足够好(请参见本互动课程):

注意,您可以在创建时设置标准Tk顶级和Ttk小部件的类。这会使事情变得相当复杂。使用toplevels,您可以查看
[winfo toplevel$w]eq$w
是否正确,但从8.5版开始,这不是一个保证的测试,因为可以将toplevels作为另一个小部件的子部件重新租入,或者将经典帧转换为toplevels(通过
wm forget
/
wm manage

如果必须获得用于创建小部件的确切命令,唯一真正可靠的方法是捕获创建命令并记录信息,如下所示:

rename frame the_real_frame
proc frame {pathName args} {
    set ::creationInfo($pathName) [list frame $args]
    the_real_frame $pathName {*}$args
}

通常更容易避免这种复杂性(特别是在生产环境中,您还需要设置一些东西来处理
事件,以便清理不再存在的小部件的信息,这只会增加更多的麻烦)。

不,没有完美的解决方案。大多数从事这类工作的人都在尝试进行GUI序列化,从应用程序的角度而不是工具包的角度来看,最好在更高的层次上进行。Tk在内部使用了大量您可能不想拦截的小部件。谢谢您,Donal,一如往常:)但是,不,我没有遵循GUI序列化路径。我正在考虑使用Tcl/Tk进行大规模GUI编程,以及处理这种复杂性的方法。@Marco好吧,我们没有您想要的东西。总的来说,我认为围绕小部件封装类,然后在该级别上记忆东西更容易。例如,您记得您弹出了一个带有特定消息的窗口,而不是对话框的内部构造或布局。不,没有完美的解决方案。大多数从事这类工作的人都在尝试进行GUI序列化,从应用程序的角度而不是工具包的角度来看,最好在更高的层次上进行。Tk在内部使用了大量您可能不想拦截的小部件。谢谢您,Donal,一如往常:)但是,不,我没有遵循GUI序列化路径。我正在考虑使用Tcl/Tk进行大规模GUI编程,以及处理这种复杂性的方法。@Marco好吧,我们没有您想要的东西。总的来说,我认为围绕小部件封装类,然后在该级别上记忆东西更容易。例如,您记得弹出一个带有特定消息的窗口,而不是对话框的内部构造或布局。