2010-04-28 2 views
2

TK를 사용하여 다른 이동도 스크롤 할 때 스크롤바가있는 텍스트 영역을 만들 수 있습니까?두 개의 텍스트 영역을 동시에 스크롤 할 때 스크롤바로 두 개의 Perl/TK 텍스트 영역을 만들 수 있습니까?

내가 만들고자하는 것은 텍스트가있는 텍스트 영역과 그 다음 텍스트 행 아래의 텍스트 영역과 다른 쪽의 데이터입니다. 일종의 Excel에서 창을 고정 할 때처럼. 각 행에 대한 배열 집합에 데이터가 있으므로 각 텍스트 영역의 스크롤 막대를 연결하는 방법이 필요하므로 데이터의 위 아래 행이 행 머리글을 제어하고 왼쪽은 왼쪽 행을 제어합니다. 오른쪽 데이터 중 하나가 열 제목을 제어하고 반대의 경우도 마찬가지입니다.

아마 불가능하지만 난 몇 가지 코드를 가지고와 거의 내가 원하는 것을하지만 난 완전히 작동하도록 점점 도움이 필요하므로

편집

확인을 물어 다치게하지 않습니다. 이 코드 예제는 한 스크롤바를 움직이면 실제로 다른 텍스트 영역을 제어하고 그 반대의 경우에도 텍스트 영역을 제어하지 않는다는 것을 보여줍니다. 여러 개의 xview를 명령에 추가하여 두 텍스트 영역을 동일하게 시각. 미리 감사드립니다.

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으로 전화하십시오.

내 원래의 대답을 썼을 때, 당신이 펄/Tk를 사용하고 있던 볼을주의 깊게 충분히 읽어 보지 않았

UPDATE - 난은 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

+0

정말 대단히 감사합니다. 지금 당신이 제공 한 것을 사용할 수 있으며, 이제는 제가 필요로하는 것을 확장 할 수 있습니다. 다시 한번 귀하의 시간과 도움에 감사드립니다. – Glen

관련 문제