【问题标题】:Tcl/Tk : Is there a way to get the list of options and commands of a Tcl/Tk widget using instrospection or reflection?Tcl/Tk:有没有办法使用自省或反射来获取 Tcl/Tk 小部件的选项和命令列表?
【发布时间】:2014-09-28 11:59:30
【问题描述】:

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

我正在考虑类似 Python 的东西:X.__dict__,它返回任意对象 x 的属性字典。

我尝试了infowinfo,但似乎没有成功

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

提前致谢!

【问题讨论】:

  • 如果.x 是小部件的路径,.x configure 会为您提供一个列表列表,其中每个列表中的第一项是小部件的选项。 .x notawidgetcommand 给你一个枚举命令的错误消息,也许你可以用它做点什么?

标签: reflection tcl tk introspection


【解决方案1】:

要获取小部件的选项列表,请使用 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 来获得它,但某些小部件可以在创建时发生变异。阅读文档是无可替代的……当然,除了在这里提出具体的问题。

【讨论】:

    【解决方案2】:
    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
      }
    

    【讨论】:

    • 本网站上通常不赞成仅使用代码的答案。您能否编辑您的答案以包含一些 cmets 或对您的代码的解释?解释应回答以下问题:它有什么作用?它是如何做到的?它去哪儿了?它是如何解决OP的问题的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多