Czy za pomocą TK można tworzyć obszary tekstowe z paskami przewijania, które również przewijają się po innych ruchach?
Chcę utworzyć obszar tekstowy z nagłówkamia następnie obszary tekstowe pod nagłówkami wierszy w jednym i dane w drugim. Jak mi się podoba, gdy zamrażasz okna w programie Excel. Mam dane w zestawie tablic dla każdej linii, więc wszystko, czego potrzebuję, to sposób łączenia pasków przewijania w każdym z obszarów tekstowych, tak aby jeden z nich w górę kontrolował nagłówki wierszy i odwrotnie, a lewy po prawej jedna z danych kontroluje nagłówki kolumn i ponownie odwrotnie.
Prawdopodobnie nie jest to możliwe, ale nie zaszkodzi zapytać
EDYTOWAĆ
Ok, więc mam trochę kodu i prawie to robiczego chcę, ale potrzebuję pomocy, aby to działało całkowicie. Przykład kodu pokazuje, że jeśli przesuniesz jeden pasek przewijania, to rzeczywiście kontroluje on inny obszar tekstu, i na odwrót, ale nie kontroluje własnego obszaru tekstowego, czy istnieje sposób dodawania wielu wyrażeń do polecenia, aby przenosiło oba pola tekstowe w tym samym miejscu czas. Z góry dziękuję
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;
Odpowiedzi:
4 dla odpowiedzi № 1Z pewnością jest to możliwe. Użyj paska przewijania -command
opcja wywołania procedury. W tej procedurze zadzwoń yview
na każdym obszarze tekstowym, który chcesz przenieść.
AKTUALIZACJA
Kiedy napisałem moją oryginalną odpowiedź, nie przeczytałem wystarczająco uważnie, aby zobaczyć, że używasz Perla / Tk - założyłem Tcl / Tk, jednak ta sama zasada obowiązuje.
Poniższy kod zastępuje to, co masz poniżej pierwszego $mw->focus;
- wykorzystuje pojedynczy poziomy pasek przewijania do sterowania dwoma widżetami tekstowymi.
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;