Tcl/Tk:是否有办法从Tcl中使用自省或反射来获取Tcl/Tk小部件的选项和命令列表?
我在想类似Python: X.__dict__
的东西,它返回一个任意对象x的属性字典。
我尝试了info
和winfo
,但它似乎不做的伎俩
如果可以通过代码访问这些属性,它将节省我手工编写它们的努力,一个小部件一个小部件(我正在尝试创建"又一个Tcl/Tk"绑定…)
要获取小部件的选项列表,请使用不带额外选项的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
和一些regexp编写脚本,并且消息的格式非常风格化,但是除了交互之外没有那么多的意义;代码将不知道何时使用方法(并且对于如何使用方法也没有更好的想法)。一旦你教会了它,你就不那么需要泛型内省器了…
所有小部件都有configure
和cget
。如果没有,它就不是一个小部件。其他的都取决于课程。您可以使用winfo class
来实现这一点,但有些小部件在创建时可能会发生突变。当然,除了问特定的问题之外,没有什么可以替代阅读文档。
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
}