Tk中的文本小部件不会滚动

时间:2014-09-25 06:22:16

标签: widget scroll tcl tk

我正在创建一个Tk toplevel窗口,其中包含许多不适合单个屏幕的小部件,所以我决定在窗口中添加一个垂直滚动条。我的GUI的基础是顶层窗口$ w和框架$ w.baseframe。

当我发现Tk中的帧无法滚动且我也无法使用BWidgets滚动帧时,我决定使用可滚动的Text小部件$ w.text而不是我的$ w.baseframe帧。我把所有的孩子小工具放进去,并添加了一个垂直滚动条,如下所示:

text $w.frame -yscrollcommand {$w.scrollbar set}
scrollbar $w.scrollbar -command {$w.text yview}

<here I set all my other widgets>
<here I pack all my other widgets into the $w.text>

pack $w.scrollbar -side right -fill y
pack $w.frame -side left -fill both -expand 1    

当我运行脚本时,所有小部件都在Text小部件中正确显示,我可以看到窗口右侧的垂直滚动条,但滚动条会执行任何操作,它会向上或向下滚动一半我的小部件是不可见的,因为顶层窗口太高了。

感谢您的建议!

修改

这是我的代码的一个非常简化的版本。我在一列中添加了200个按钮。当我运行thius代码时,我看到一个从屏幕顶部到底部的顶层窗口,我看到右侧有一个滚动条,但它无效。

set w .testwindow

catch {destroy $w}
toplevel $w
wm title $w "title"
text $w.text -yscrollcommand {$w.scrollbar set}
scrollbar $w.scrollbar -command {$w.text yview}

for {set i 0} {$i < 200} {incr i} {
    frame $w.text.$i
}

for {set i 0} {$i < 200} {incr i} {
    button $w.text.$i.btn -text "btn $i"
    pack $w.text.$i.btn
}

for {set i 0} {$i < 200} {incr i} {
    pack $w.text.$i
}

pack $w.scrollbar -side right -fill y
pack $w.text -side left -fill both -expand 1

1 个答案:

答案 0 :(得分:1)

它应该运行正常,但我认为您忘记更改一些变量的名称,例如,您的文本小部件名为$w.frame,因此您的滚动条应设置为此而不是{{1 }}:

$w.text

当我使用此修改后的行运行上述内容时,它对我来说很好。


编辑:

这是一个类似的文本小部件,其中包含按钮:

scrollbar $w.scrollbar -command {$w.frame yview}

请注意,我使用的是set w .testwindow catch {destroy $w} toplevel $w wm title $w "title" text $w.text -yscrollcommand {$w.scrollbar set} scrollbar $w.scrollbar -command {$w.text yview} for {set i 0} {$i < 200} {incr i} { $w.text window create end \ -create "button %W.click$i -text \"btn $i\" \ -command {do stuff}" $w.text insert end "\n" } pack $w.scrollbar -side right -fill y pack $w.text -side left -fill both -expand 1 ,它特定于文本小部件,并允许在文本小部件中嵌入各种其他小部件。

另外,如果您没有使用&#39;外部&#39;在示例中,变量如$w.text window create,大括号将避免这些反斜杠:

$i