用于控制滚动条的绑定和事件

时间:2017-12-18 13:14:04

标签: tcl tk

我有一个框架/画布,由水平和垂直滚动条控制。 我按下了按下的鼠标左键。

bind $canvas <ButtonPress-1>   [list start $canvas]
bind $canvas <ButtonRelease-1> stop

这会“抓取”画布在按下鼠标时移动它。

我尝试使用

进行控制
proc start {c} {
  move
}
proc move {} {
 .<MISSING IDEE>....
 after 10 move
}
proc stop {} {
  after cancel move
}

我的问题是现在。什么可以是画布和滚动条之间的粘合剂,通过移动按下的鼠标指针来控制xscroll和yscroll。是否有技巧或我在canvas和滚动条中处理位置

1 个答案:

答案 0 :(得分:0)

同步画布和滚动条

“胶水”是将滚动条与画布绑定的配置选项,反之亦然。这是一个两步过程:配置画布以知道其滚动条是什么,以及配置滚动条以了解它们在滚动什么。

首先,必须告知画布要在水平和垂直维度上更新哪个滚动条。例如,假设您的滚动条被标识为$vsb$hsb。您可以这样配置画布:

$canvas configure -xscrollcommand [list $hsb set] -yscrollcommand [list $vsb set]

使用上述方法,无论可滚动区域的大小发生变化还是画布滚动(无论如何),滚动条都会更新以反映当前视图。

接下来,您必须对滚动条执行类似的步骤。在这种情况下,选项为-command,它告诉滚动条移动滚动条时要运行什么命令。所有可滚动的小部件都提供了一个命令,可以调用该命令来调整小部件的视图。

例如:

$vsb configure -command [list $canvas yview]
$hsb configure -command [list $canvas xview]

以编程方式滚动画布

要以编程方式在move函数中滚动画布,您只需要做与滚动条相同的操作即可:调用xview和/或yview命令。这些命令使用其他参数来知道滚动多少和向哪个方向滚动。

例如,要模拟将水平滚动条向右拖动一个像素,您可以这样做:

$canvas xview scroll 1 units

调用该函数时,其行为将与拖动滚动条时完全一样。

有关更多信息,请参见xviewyview canvas命令上的文档。

使用画布的内置功能

如果您的目标是使用鼠标滚动画布,则可以删除几乎所有代码,并用对画布提供的scan命令的调用来替换它。

例如:

bind $canvas <ButtonPress-1> {%W scan mark %x %y}
bind $canvas <B1-Motion> {%W scan dragto %x %y 1}