Tcl / Tk:有没有办法使用instrospection或反射来获取Tcl / Tk小部件的选项和命令列表?

时间:2014-08-05 17:56:42

标签: reflection tcl tk introspection

Tcl / Tk:有没有办法使用Tcl中的内省或反思来获取Tcl / Tk小部件的选项和命令列表?

我正在考虑像Python这样的东西:X.__dict__,它返回一个任意对象x的属性字典。

我尝试了infowinfo,但它似乎没有做到这一点

如果可以通过代码访问这些属性,它将节省我手动编写代码的工作量,小部件的小部件(我正在尝试创建“又一个Tcl / Tk”绑定...)

提前致谢!

2 个答案:

答案 0 :(得分:2)

要获取窗口小部件的选项列表,请使用configure命令,无需额外选项。

% button .b
.b
% puts [join [lmap c [.b configure ] {if {[llength $c] == 2} continue; lindex $c 0}] \n]
-activebackground
-activeforeground
-anchor
-background
-bitmap
-borderwidth
-command
-compound
-cursor
-default
-disabledforeground
-font
-foreground
-height
-highlightbackground
-highlightcolor
-highlightthickness
-image
-justify
-overrelief
-padx
-pady
-relief
-repeatdelay
-repeatinterval
-state
-takefocus
-text
-textvariable
-underline
-width
-wraplength

如果您没有8.6,那么您必须这样做:

foreach config [.b configure] {
    if {[llength $config] == 2} continue
    puts [lindex $config 0]
}
# Same output

获取子命令列表的最简单方法(但如果需要,可以将它们称为方法)是查看错误消息。

% .b ?
bad option "?": must be cget, configure, flash, or invoke

按钮没有那么多子命令。

可以编写带有catch和一些正则表达式的脚本,并且消息的格式非常风格化,但除了交互式之外没有那么多点;代码在使用方法时不知道(并且对如何使用它有更好的了解)。一旦你教过它,你就不需要那么多的通用内置探测器......


所有小部件都有configurecget。如果它不是,它不是一个小部件。其他一切都取决于课程。您可以使用winfo class获得该功能,但某些小部件可以在创建时进行变更。除了在这里询问特定的问题之外,没有其他方法可以替代阅读文档。

答案 1 :(得分:0)

proc saveOptions {} {
    set f [open saved_defaults w+]
    foreach w {button checkbutton \
         radiobutton menubutton \
         entry menu label spinbox \
         listbox canvas scrollbar scale frame} {
        set x [$w .xx]        
        foreach b [$x configure] {
            if {[llength $b] == 2} continue;
            puts $f "*[string totitle $w].[lindex $b 1]:[lindex $b end]"
        }
        destroy $x
      }
      close $f
  }