2010-04-28 51 views
2

是否有可能使用TK创建文本区与当您滚动一个其他的移动以及滚动条?如何创建2个滚动条的Perl/TK文本区域,当我滚动时,两个文本区域同时滚动?

我想创建是在一个在头,然后文本区域行标题的下面和数据,还有一个文本区域。有点像在Excel中冻结窗格时。我有一个集合的各线阵列的数据,所以我需要的是在每一个文本区域的连接滚动条使上下一个数据还控制行标题,反之亦然的一种方式,而左正确的一个数据控制列标题,反之亦然。

也许不可能,但不伤害要求

编辑

好了,所以我有一些代码,它几乎是我想要做什么,但我需要一些帮助,得到它的完全工作。代码示例表明,如果你移动一个滚动条,它确实控制着其他文本区域,反之亦然,但它不控制自己的文字区域,是否有添加多个xviews以命令的方式,因此在同一移动两个文字区域时间。在此先感谢

use Tk; 
use Tk::ROText; 

my @headers = ("+----------------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+", 
       "|    | M | M | M | M | M | M | M | M | M | M | M | M | M | M |", 
       "|    | P | P | P | P | P | P | P | P | P | P | P | P | P | P |", 
       "|    | L | L | L | L | L | L | L | L | L | L | L | L | L | L |", 
       "|    | R | R | R | R | R | R | R | R | R | R | R | R | R | R |", 
       "|    | D | D | D | D | D | D | D | D | D | D | D | D | D | D |", 
       "|    | F | F | F | F | F | F | F | F | F | F | F | F | F | F |", 
       "|    | D | D | D | D | D | D | D | D | D | D | D | D | D | D |", 
       "|    | S | S | S | S | S | E | E | E | E | E | E | B | B | B |", 
       "|    | O | O | O | O | O | V | V | V | V | V | V | A | A | A |", 
       "|    | A | A | A | A | A | F | F | F | F | F | F | Q | Q | Q |", 
       "|    | K | K | K | K | K | B | C | F | G | H | I | A | A | A |", 
       "|    | 1 | 5 | 6 | 7 | 8 |  |  |  |  |  |  | 1 | 2 | 3 |"); 

my @info = ( "+----------------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+", 
       "| LHADHRDT  |  |  |  |  |  |  |  |  |  |  |  |  |  | 1|", 
       "+----------------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+", 
       "| LHBAERDT  |  | 4|  | 4|  |  |  |  |  |  |  |  |  |  |", 
       "+----------------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+", 
       "| LHEE1RDT  |  |  | 13|  |  |  |  |  | 48|  |  |  |  |  |", 
       "+----------------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+", 
       "| LHLM2RDT  | 96|  |  |  |  |  |  |  |  |  |  |  |  |  |", 
       "+----------------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+", 
       "| LHLSERDT  |  |  |  |  |  |  |  |  |  |  |  |  | 7|  |", 
       "+----------------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+", 
       "| LHLW1RDT  |  |  |  |  |  |  |  |  |  |  | 9304|  |  |  |", 
       "+----------------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+", 
       "| LHUP1RDT  |  |  |  |  | 160|84385|  |  |  | 271|  |  |  |  |", 
       "+----------------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+"); 

my $mw = MainWindow->new (-background => "GREY"); 
$mw->title("What Gap Issues There Have Been"); 
$mw->resizable(0, 0); 
$mw->focus; 
$mw->geometry("600x400"); 

my $TA1F = $mw->Frame(-width=>5,-height=>5,-foreground=>"BLUE",-background=>"GREY",-borderwidth=>2,-relief=>'groove')->place(-x=>5,-y=>5); 
my $TA1 = $TA1F->Scrolled('ROText', -scrollbars => 'se', -height => 10)->pack(-side => 'left'); 
$TA1->configure(-background => "GREY",-wrap=>"none"); 
$TA1->insert('end', "$_\n") foreach @headers; 

my $TA2F = $mw->Frame(-width=>5,-height=>5,-foreground=>"BLUE",-background=>"GREY",-borderwidth=>2,-relief=>'groove')->place(-x=>5,-y=>200); 
my $TA2 = $TA2F->Scrolled('ROText', -scrollbars => 'se', -height => 10)->pack(-side => 'left'); 
$TA2->configure(-background => "GREY",-wrap=>"none"); 
$TA2->insert('end', "$_\n") foreach @info; 

$TA1->Subwidget("xscrollbar")->configure(-command => ['xview', $TA2]); 
$TA2->Subwidget("xscrollbar")->configure(-command => ['xview', $TA1]); 

$mw->focus; 
MainLoop; 
exit 0; 

回答

4

这当然有可能。使用滚动条的-command选项来调用过程。在该程序中,请在要移动的每个文本区域上拨打yview

UPDATE

当我写我原来的答复,我没有仔细阅读不够看你使用Perl/Tk的 - 我假设的Tcl/Tk。尽管如此,同样的原则适用。

下面的代码替换你的第一$mw->focus;下面的东西 - 它使用一个单一的水平滚动条来控制两个文本部件。

my $horiz = $mw->Scrollbar(-orient => 'horizontal'); 

my $f1 = $mw->Frame(); 
my $vert1 = $f1->Scrollbar(); 
my $text1 = $f1->ROText(
        -height => 10, -wrap => 'none', 
        -yscrollcommand => [set => $vert1], 
        -xscrollcommand => [set => $horiz], 
       ); 
$text1->insert('end', "$_\n") foreach @headers; 
$text1->pack(-side => 'left'); 

$vert1->configure(-command => [yview => $text1]); 
$vert1->pack(-side => 'left', -fill => 'y', -expand => 1); 

my $f2 = $mw->Frame(); 
my $vert2 = $f2->Scrollbar(); 
my $text2 = $f2->ROText(
        -height => 10, -wrap => 'none', 
        -yscrollcommand => [set => $vert2], 
        -xscrollcommand => [set => $horiz], 
       ); 
$text2->insert('end', "$_\n") foreach @info; 
$text2->pack(-side => 'left'); 

$vert2->configure(-command => [yview => $text2]); 
$vert2->pack(-side => 'left', -fill => 'y', -expand => 1); 

$horiz->configure(-command => sub { $text1->xview(@_); $text2->xview(@_) }); 

$f1->pack; 
$f2->pack; 
$horiz->pack(-fill => 'x', -expand => 1); 

MainLoop; 
exit 0; 
+0

嘿谢谢格伦我会试试看看我能得到多少。 – Glen 2010-04-28 13:45:40

+0

这真棒,非常感谢,我现在可以使用你提供的东西,并扩大到我的需要,现在我有原则。 我再次感谢您的时间,并在此帮助 – Glen 2010-04-29 14:56:40