2

TK を使用して、一方をスクロールすると他方も移動するスクロールバー付きのテキスト領域を作成することは可能ですか?

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

おそらく不可能ですが、尋ねても害はありません

編集

わかりましたので、いくつかのコードを取得しましたが、それはほとんど私が望むことを実行しますが、完全に機能させるには助けが必要です。コード例は、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;
4

1 に答える 1

4

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

アップデート

私が最初の回答を書いたとき、あなたが Perl/Tk を使用していることがわかるほど注意深く読んでいませんでした -- 私は Tcl/Tk を想定していました。それでも、同じ原則が適用されます。

次のコードは、最初のコードの下にあるものを置き換えます$mw->focus;。1 つの水平スクロールバーを使用して 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;
于 2010-04-28T13:43:30.727 に答える