原文:
10.7. How do I bind the action of a slider (sic) to ... ?
Technically speaking they are called Scrollbars (not sliders) and one must configure the action of the desired widget to call the Scrollbars (i.e. bind is not involved here)
A common task using Scrollbars is to configure things like Canvas, Listbox, or a Text widgets to be updated (change appearance) when the slider of the acompanying Scrollbar is moved by the user.
As an example consider the code that sets up a twelve element Listbox and an accompanying vertical Scrollbar: my $main = new MainWindow; my $box = $main->Listbox(-relief => 'sunken', -width => -1, # Shrink to fit -height => 5, -setgrid => 'yes'); my @items = qw(One Two Three Four Five Six Seven Eight Nine Ten Eleven Twelve); foreach (@items) { $box->insert('end', $_); } my $scroll = $main->Scrollbar(-command => ['yview', $box]);
So far so good. But merely setting them up does not mean that the Listbox even knows that the Scrollbar is lying next to it. Note that the scalar variable $scroll is how we refer to the Scrollbar, thus, hooking the $box up to handle $scroll events is a matter of configuration: $box->configure(-yscrollcommand => ['set', $scroll]);
A complete script that makes use of this code (and adds the necessary calls to pack and MainLoop;) is given as the fifth example in UserGuide.pod (and may be found at http://www.perltk.org/contrib/pod/.)
There was an old Perl/Tk tendency to have a bunch of ScrlFoo widgets (such as ScrlListbox). The use of such widgets is now deprecated in favor of a new Scrolled class, as in: $w = $patent->Scrolled('Text',...);
The widgets that can be ->Scrolled() include:
* Canvas (::Axis)
* Entry
* Ghostview
* HList
* HTML (::Web)
* Listbox
* Pod
* Text (::ROText) (::TextUndo)
* Tiler
译文:
10.7. 如何设置游标(slider)的绑定?
首先,它们真正专业的名称是滚动条(Scrollbars,不是游标)。使用时需要对所用组件的操作进行配置来调用滚动条,因此,其实这里与绑定没有关系。
通常,我们用滚动条来配置诸如Canvas、Listbox或Text等组件,以使它们可以在用户滑动相应的滚动条时进行更新(也就是变化外观)。
在下面的例子中,我们构建了一个包含12个元素的Listbox和一个相应的垂直滚动条:
my $main = new MainWindow;
my $box = $main->Listbox(-relief => 'sunken',
-width => -1, # Shrink to fit
-height => 5,
-setgrid => 'yes');
my @items = qw(One Two Three Four Five Six Seven
Eight Nine Ten Eleven Twelve);
foreach (@items) {
$box->insert('end', $_);
}
my $scroll = $main->Scrollbar(-command => ['yview', $box]);
到目前为止,一直都还不错。但是,只是构建了这些并不意味着Listbox已经知道了滚动条就在它的旁边。请注意,这里的标量$scroll就是我们构建的滚动条,因此基本的配置就是要让$box能够响应$scroll的事件:
$box->configure(-yscrollcommand => ['set', $scroll]);
关于这段例子的完整代码(也就是加上了必要的pack和MainLoop等)可以参考UserGuide中的第五个例子。
(译者注:这里为了方便大家,就直接给出来了:
#! /usr/bin/perl5 -w
use strict;
use Tk;
my $main = MainWindow->new;
my $box = $main->Listbox(-relief => 'sunken',
-width => -1, # Shrink to fit
-height => 5,
-setgrid => 1);
my @items = qw(One Two Three Four Five Six Seven
Eight Nine Ten Eleven Twelve);
foreach (@items) {
$box->insert('end', $_);
}
my $scroll = $main->Scrollbar(-command => ['yview', $box]);
$box->configure(-yscrollcommand => ['set', $scroll]);
$box->pack(-side => 'left', -fill => 'both', -expand => 1);
$scroll->pack(-side => 'right', -fill => 'y');
MainLoop;
)
过去Perl/Tk中有一类诸如ScrlFoo的组件(例如ScrlListbox),但是现在已经被弃用了。取而代之的是一个新的Scrolled类,例如:
$w = $patent -> Scrolled(‘Text’,…);
可以使用->Scrolled()的组件包括:
* Canvas (::Axis)
* Entry
* Ghostview
* HList
* HTML (::Web)
* Listbox
* Pod
* Text (::ROText) (::TextUndo)
* Tiler