in reply to Re^2: I seek illumination and knowledge
in thread I seek illumination and knowledge

Hi, no problem. When I first tried setting this up myself, there was a question of whether to use Scrolled Canvases, or make separate plain canvases and scrollbars, and link them manually. Then I hit the scrollbar alignment problem, as you are experiencing on Windows, when trying the manual linking approach. On linux, they aligned with Scrolled-Canvases, so I went with that. But here is my original manual attempt, which may help you. It has other glitches on linux, like when you scroll to the extreme ends of the scrollbar regions, it loses linearity. But it may work better on Windows.

For what it's worth, I originally was trying to copy the Table functionality of Gtk2, to align everything, see Gtk2 linked scrolled Canvases in table for a Gtk2 version of this using Tables. Tables are the way to go, and if you can switch to Perl/Gtk2 you may be better off. CamelBox installs and works well for me on my Vista Basic testbox, but I normally don't use Windows at all.

So here is an alternate Tk method. I spent all afternoon trying this stuff out, so I don't care to try and jump in to fix the Linux/Win32 incompatibilities....but you may be luckier. Like I said, if you want easy Linux/Win32 compatibility, go with the Tables of Gtk2.

#!/usr/bin/perl use warnings; use strict; use Tk; my $mw = new MainWindow(); $mw->geometry("600x400+200+200"); #for xscroll, must be packed before midframe to be visible my $botframe = $mw->Frame(-bg=>'grey45') ->pack(-fill=>'x',-side=>'bottom'); my $midframe = $mw->Frame(-bg=>'grey45')->pack(); my $midframel = $midframe->Frame(-bg=>'grey45') ->pack(-side=>'left',-expand=>1,-fill=>'y'); my $midframer = $midframe->Frame(-bg=>'grey45') ->pack(-side=>'right'); my $num_channels = 40; my $canvasp; my $canvast = $midframer->Canvas( -bg =>'pale goldenrod', -width=>2400, -height=>25, #need to set scrollregion with a bit extra to ensure #endpoint accuracy. See xscrollit sub -scrollregion=>[-10,0,7250,25], -xscrollincrement => 1, )->pack(-side=>'top'); #for canvasp and yscroll my $midframer1 = $midframer->Frame(-bg=>'grey45') ->pack(-side=>'top'); my $yscroll = $midframer1->Scrollbar( -orient => 'vertical', -command => \&yscrollit, -troughcolor =>'grey45', -activebackground =>'lightseagreen', -background => 'lightseagreen', )->pack(-side=>'right',-fill=>'y'); my $canvasxsd = $botframe->Canvas( #dummy filler -bg =>'grey45', -width=>75, -height=>25, -borderwidth=>0, ) ->pack(-side=>'left'); my $xscroll = $botframe->Scrollbar( -orient => 'horizontal', -command => \&xscrollit , -troughcolor =>'grey45', -activebackground =>'lightseagreen', -background => 'lightseagreen', )->pack(-side=>'right', -fill=>'x',-expand =>1); $canvasp = $midframer1->Canvas( -bg =>'lightsteelblue', -width=>2400, -height=> 50 * $num_channels, -scrollregion=>[-10,0,7250,(33 * $num_channels)], -xscrollincrement => 1, -yscrollincrement => 1, -xscrollcommand => [ 'set', $xscroll ], -yscrollcommand => [ 'set', $yscroll ], ) ->pack(-side=>'left');#,-fill=>'both'); my $canvasd = $midframel->Canvas( #top of left frame dummy filler -bg =>'grey45', -width=>75, -height=>25, -borderwidth =>0, )->pack(-side=>'top'); my $canvass = $midframel->Canvas( #left frame canvas -bg =>'lightseagreen', -width=>75, -height=> 50 * $num_channels, -scrollregion=>[0,0,75,(33 * $num_channels)], -yscrollincrement => 1, ) ->pack(-side=>'top'); #fill in some sample data to see scrolling action for( 0 .. 33 * $num_channels){ $canvass->createText(38, 10 + $_ * 33, -text => "C $_" , ); } #set up top frame canvas... a timeline for(0..7200){ if( $_ % 50 == 0){ $canvast->createLine($_,0,$_,12,-width=> 4,-tags=>['tick'] ); $canvast->createText($_, 20, -text=> $_,-tags=>['tick'] ); } } #set up main frame some canvas data foreach my $y (0..39){ foreach my $x (0..7200){ next unless ( $x % 5 == 0); next if 20*$x > 7200; $canvasp->createText($x * 20, 8 + $y * 33, -text=> 20*$x.'-'.$y, -tags=>['data'] ); } } MainLoop; ################################### sub xscrollit{ my $fraction = $_[1]; $canvast->xviewMoveto($fraction); $canvasp->xviewMoveto($fraction); } ################# sub yscrollit{ my $fraction = $_[1]; $canvass->yviewMoveto($fraction); $canvasp->yviewMoveto($fraction); } ##############

I'm not really a human, but I play one on earth Remember How Lucky You Are

Replies are listed 'Best First'.
Re^4: I seek illumination and knowledge
by deesler (Novice) on Jan 21, 2009 at 20:18 UTC
    Thanks once more, I really appreciate it (We don't do too many of this type of GUI around here, so when I get stuck, not too many people to ask.)

    Can you point me to the instructions on the Perl Monks website that shows me how to send you a private message, so that I don't have to subject everyone to my ignorance (just you) ?

    I have found several places that look promising, but none of them gives me an opportunity to enter the actual text of a message.

      Click on the link to my name, then look for the link "Send Private Message". Or..... you can just go to the Chatterbox, and start a message "/msg zentara ....your stuff follows". That will send a private message to me. Remember, the messaging system is limited in length, so it's not good for anything but short questions.

      I'm not really a human, but I play one on earth Remember How Lucky You Are