/ /スクロールバーを使用して2つのPerl / TKテキスト領域を作成し、一方をスクロールすると両方のテキスト領域が同時にスクロールするようにするにはどうすればよいですか? --perl、textarea、scrollbar、tk

2つのテキストエリアを同時にスクロールするとスクロールバーを使用して2つのPerl / TKテキストエリアを作成するにはどうすればよいですか? - perl、textarea、scrollbar、tk

TKを使用して、スクロールバーを使用してテキスト領域を作成し、スクロールすると互いに移動することはできますか?

作成したいのはヘッダー付きのテキストエリアです一方の行見出しともう一方のデータの下のテキスト領域。 Excelでペインをフリーズするときのようなものです。各行の配列のセットにデータがあるので、必要なのは各テキスト領域のスクロールバーをリンクする方法だけです。データの上下のスクロールバーも行見出しを制御し、その逆も同様です。データの右側の1つが列見出しを制御し、その逆も同様です。

おそらく不可能ですが、質問しても問題ありません

EDIT

さて、私はいくつかのコードを持っています、そしてそれはほとんどあります私が欲しいものですが、それを完全に機能させるためにいくつかの助けが必要です。コード例は、1つのスクロールバーを移動すると、実際に他のテキスト領域を制御し、その逆も同様ですが、独自のテキスト領域を制御しない場合、コマンドに複数の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;

回答:

回答№1は4

それは確かに可能です。スクロールバーを使用してください。 -command プロシージャを呼び出すオプション。その手順では、 yview 移動する各テキスト領域。

更新

私が最初の答えを書いたとき、私はあなたがPerl / Tkを使用しているのを見るのに十分注意深く読んでいませんでした-私はTcl / Tkを仮定しました。それにもかかわらず、同じ原則が当てはまります。

次のコードは、最初のコードの下にあるものを置き換えます $mw->focus; -単一の水平スクロールバーを使用して2つのテキストウィジェットを制御します。

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;