Tk Widget: Scrolled Frame

Scrolled Canvas

先看一个scrolled canvas的实现

 proc scrolled {w} {
    set pa [set pa0 [winfo parent $w]]
    if {$pa eq "."} {set pa ""}
    grid $w [scrollbar $pa.y -command "$w yview"] -sticky news
    $w configure -xscrollcommand "$pa.x set" -yscrollcommand "$pa.y set"
    grid $pa.y -sticky ns
    grid [scrollbar $pa.x -ori hori -command "$w xview"] -sticky ew
    grid columnconfigure $pa0 0 -weight 1
    grid rowconfigure    $pa0 0 -weight 1
 }

示例:

canvas .c -background beige
 .c create line 10 10 1000 1000
 .c configure -scrollregion [.c bbox all]
 scrolled .c

Ref: http://wiki.tcl.tk/27946

总结一下关键点:

  • 利用grid布局管理器管理进行布局
  • 利用canvas的xviewyview命令实现canvas的滚动
  • 利用canvas的-xscrollcommand-yscrollcommand和滚动条进行同步

遗憾的是,scrolled frame却不能简单地套用方法。因为frame自身不支持xviewyview这样的命令。

Scrolled Frame

如果一个frame组件可以支持xviewyview,就可以用类似于上面scrolled canvas的方法。

所谓的scrolled,实际上是指frame的size大于可见区域时只显示其中一部分。这要求frame在布局时要能够放置在可见区域之外。能满足这一点的最合适的内置布局管理器是place

Ref: http://wiki.tcl.tk/9223

Leverage Canvas

TODO

Other Resource

TODO