Updated 2017-05-16 09:53:39 by pooryorick

winfo, a builtin Tk command, returns information about a window.

See Also  edit

wm
information related to the Window manager.

Common subcommands  edit

Description  edit

To ensure that the window is fresh, it's usually best to call winfo from a script bound to <Configure>.

Rarely-used subcommands  edit

You probably don't need to use these subcommands, either because they couple to functionality that is largely obsolete in the days of universal full-depth displays or because they require deep knowledge of the X protocol to make use of.

  • [winfo atom] ?-displayof window? name
  • [winfo atomname] ?-displayof window? id
  • [winfo cells] window
  • [winfo colormapfull] window
  • [winfo depth] window
  • winfo id window
  • winfo interps ?-displayof window?
  • [winfo pathname] ?-displayof window? id
  • [winfo screen] window
  • [winfo screencells] window
  • [winfo screendepth] window
  • [winfo screenvisual] window
  • [winfo visual] window
  • [winfo visualid] window
  • [winfo visualsavailable] window ?includeids?

winfo class  edit

RS 2006-04-12: winfo class returns for toplevels the app name (as from the topmost script), else the Titlecased widget type. Here's a little convenience proc that returns the suitable Tk command for deserializing a widget:
proc winfo'class w {
    if {[winfo toplevel $w] eq $w} {return toplevel}
    string tolower [winfo class $w]
}

MG: This seems to only be the case for ".". Other toplevels seem to return "Toplevel" as you'd expect. (Anyone know why it returns the app name for ".", though? Curious what the thought behind it was.)

DKF: It relates to option database support. In particular, other names would be used by completely different applications (e.g. Firefox, Xterm, etc.)

MG Ahh, I see. Thanks :)

The Window Under the Pointer  edit

PYK 2017-05-16: [auriocus] provided this in the Tcl Chatroom:
# print the window name under the mouse cursor
proc pickwin {} {
    after 1000 {
        set pickwidget [winfo containing {*}[winfo pointerxy .]]
        if { $pickwidget ne {} } {
            puts $pickwidget
            foreach option [$pickwidget configure] {
                # leave out synonym options
                if { [llength $option] != 5 } continue
                lassign $option name dbname dbclass defvalue currentvalue
                if { $defvalue != $currentvalue } { puts "  $name $currentvalue" }
            }
        } else { puts "No widget under cursor." }
    }
}