Dear Bretheren, I wrote this charting script, it creates charts of wind/solar power generation for a small house. Everything is great, except that the mouse wheel scrolls individual charts up and down instead of moving all of them together. I can only scroll the entire page using the side scroll bar. Here is a picture of the program:
http://pashanoid.ru/images/windgen.png
Please help me stop the scroll wheel from moving individual charts up and down, and make it move the entire window!
#!/usr/bin/perl use strict; use warnings; use Tk; use Tk::Chart; use Tk::Chart::Lines; use Tk::Canvas::GradientColor; use Tk::Pane; use DBI; use utf8; use Tk::DateEntry; use POSIX qw/strftime/; use Time::Local; my ($mw, $pane); my (@data0, @data1, @data2, @data3); #my $datemin = '2012-01-16 05:59:06'; #my $datemax = '2012-01-16 10:07:32'; my $datemin; my $datemax; my $color_start = '#ffffff'; #my $color_end = '#DF776F'; my $color_end = '#bbbbbb'; &dates; #print "datemin = $datemin datemax=$datemax\n"; #my $date; my ($chart0, $chart1, $chart2, $chart3, $xlabelskip); my ($powermax, $powermin, $poweravg); my ($speedmax, $speedmin, $speedavg, $powersum); my ($battmax, $battmin, $battavg); my ($powersunmax, $powersunmin, $powersunavg, $powersunsum); my (@timeline, @speed, @power, @v_acc, @powersun); &update_data; &create_mw; &set_charts; &render; MainLoop(); exit; sub draw_charts { $chart0->clearchart; $chart1->clearchart; $chart2->clearchart; $chart3->clearchart; $chart0->destroy; $chart1->destroy; $chart2->destroy; $chart3->destroy; $mw->destroy; &create_mw; &update_data; &set_charts; &render; } sub render { $chart0->plot(\@data0); #u akb $chart1->plot(\@data1); #sun p $chart2->plot(\@data2); #wind p $chart3->plot(\@data3); #wind speed } sub create_mw { $mw = MainWindow->new(); $mw->geometry( "840x800" ); #$mw->resizable(1,1); $mw->title("SA wind generation from $datemin to $datemax"); $mw->optionAdd("*font", "*utf-8"); $mw->fontCreate('giant_rus', -family => 'nimbus sans l', -weight = +> 'normal', -size=>int(-13*13/10)); $mw->fontCreate('tiny_rus', -family => 'nimbus sans l', -weight => + 'normal', -size=>int(-12*12/10)); $pane = $mw->Scrolled(qw/Pane -scrollbars e -width 990 -height 960 +/)->pack; my $dateframe=$pane->Frame()->pack(-side=>'top', -anchor=>'nw', -p +adx=>'15'); my $datelabel = $dateframe->Label(-text => 'Диа& +#1087;азон: ', -font => 'giant_rus')->pack(-s +ide => 'left'); my @daynames=(); foreach (0..6) { push @daynames,strftime("%a",0,0,0,1,1,1,$_); } my $datebegin = $dateframe->DateEntry( -font => 'giant_rus', -daynames => \@daynames, -todaybackground => 'green', -tex +tvariable => \$datemin, -formatcmd => sub { sprintf ("%d-%02d-%02d 00:00:00",$_[0] +,$_[1],$_[2]);}, -width => 18 )->pack(-side => 'left'); my $dateend = $dateframe->DateEntry( -font => 'giant_rus', -daynames => \@daynames, -todaybackground => 'green', -tex +tvariable => \$datemax, -formatcmd => sub { sprintf ("%d-%02d-%02d 00:00:00",$_[0] +,$_[1],$_[2]);}, -width => 18 )->pack(-side => 'left'); my $buttonok = $dateframe->Button( -text=>'Ok', -command=> \&draw_ +charts )->pack(-side => 'left'); } sub set_charts{ $chart0 = $pane->Lines( -title => "U акб min: $battmin max +: $battmax avg: $battavg (m/s)", -titlefont => 'giant_rus', -textfont => 'tiny_rus', -titleheight => '5', -xlabelfont => 'tiny_rus', -ylabelfont => 'tiny_rus', -ylabel => 'V', -boxaxis => 1, -yticknumber => 5, -linewidth => 2, -bezier => 1, -alltickview => 1, -pointline => 0, -markers => [10, 9, 9], -xtickheight => 5, -ylongticks => 1, -ylongtickscolor => 'white', -xlongticks => 1, -xlongtickscolor => 'white', -width => 800, -height => 220, -yminvalue => $battmin, -ymaxvalue => $battmax, -xlabelskip => $xlabelskip, #)->pack(qw / -fill both -expand 1/); )->pack(); $chart0->enabled_gradientcolor(); $chart0->set_gradientcolor( -start_color => $color_start, -end_color => $color_end, -type => 'linear_vertical', ); $chart3 = $pane->Lines( -title => "Солнце +генерация min: +$powersunmin max: $powersunmax avg: $powersunavg (Wt) sum: $powersu +nsum (kWt*h)", -titlefont => 'giant_rus', -textfont => 'tiny_rus', -titleheight => '5', -xlabelfont => 'tiny_rus', -ylabelfont => 'tiny_rus', -ylabel => 'P', -boxaxis => 1, -yticknumber => 5, -linewidth => 2, -bezier => 1, -alltickview => 1, -pointline => 0, -markers => [10, 9, 9], -xtickheight => 5, -ylongticks => 1, -ylongtickscolor => 'white', -xlongticks => 1, -xlongtickscolor => 'white', -width => 800, -height => 220, -yminvalue => $powersunmin, -ymaxvalue => $powersunmax, -xlabelskip => $xlabelskip, -colordata => [ qw(orange) ], #)->pack(qw / -fill both -expand 1 /); )->pack(); $chart3->enabled_gradientcolor(); $chart3->set_gradientcolor( -start_color => $color_start, -end_color => $color_end, -type => 'linear_vertical', ); $chart2 = $pane->Lines( -title => "Ветрог
 +77;нерация min: $powermin +max: $powermax avg: $poweravg (Wt) sum: $powersum (kWt*h)", -titlefont => 'giant_rus', -textfont => 'tiny_rus', -titleheight => '5', -xlabelfont => 'tiny_rus', -ylabelfont => 'tiny_rus', -ylabel => 'P', -boxaxis => 1, -yticknumber => 5, -linewidth => 2, -bezier => 1, -alltickview => 1, -pointline => 0, -markers => [10, 9, 9], -xtickheight => 5, -ylongticks => 1, -ylongtickscolor => 'white', -xlongticks => 1, -xlongtickscolor => 'white', -width => 800, -height => 220, -yminvalue => $powermin, -ymaxvalue => $powermax, -xlabelskip => $xlabelskip, -colordata => [ qw(blue) ], #)->pack(qw / -fill both -expand 1 /); )->pack(); $chart2->enabled_gradientcolor(); $chart2->set_gradientcolor( -start_color => $color_start, -end_color => $color_end, -type => 'linear_vertical', ); $chart1 = $pane->Lines( -title => "Скорос +ть ветра min: $speedmin ma +x: $speedmax avg: $speedavg (m/s)", -titlefont => 'giant_rus', -textfont => 'tiny_rus', -titleheight => '5', -xlabelfont => 'tiny_rus', -ylabelfont => 'tiny_rus', -ylabel => 'V', -boxaxis => 1, -yticknumber => 5, -linewidth => 2, -bezier => 1, -alltickview => 1, -pointline => 0, -markers => [10, 9, 9], -xtickheight => 5, -ylongticks => 1, -ylongtickscolor => 'white', -xlongticks => 1, -xlongtickscolor => 'white', -width => 800, -height => 220, -yminvalue => $speedmin, -ymaxvalue => $speedmax, -xlabelskip => $xlabelskip, -colordata => [ qw(green) ], )->pack(); $chart1->enabled_gradientcolor(); $chart1->set_gradientcolor( -start_color => $color_start, -end_color => $color_end, -type => 'linear_vertical', ); } sub dates { my $dbfile = 'wind.db'; my $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile","",""); # my $sth; $sth = $dbh->prepare("select datetime('now','localtime', '-1 d +ay'), datetime('now','localtime');"); $sth->execute(); while (my @result = $sth->fetchrow_array()) { $datemin = $result[0]; $datemax = $result[1]; } $sth->finish; $dbh->disconnect; } sub update_data{ ($speedmax, $speedmin, $speedavg) = (0,0,0); ($powermax, $powermin, $poweravg, $powersum) = (0,0,0,0); ($powersunmax, $powersunmin, $powersunavg, $powersunsum) = (0,0,0, +0); @data0 =(); @data1 = (); @data2 = (); @data3 = (); @timeline = (); @speed = (); @power = (); @v_acc = (); @powersun = (); #print "sub datemax=$datemax datemin=$datemin\n"; my $count; my $dbfile = 'wind.db'; my $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile","",""); # my $sth; $sth = $dbh->prepare(" SELECT max(speed), min(speed), avg(speed), max(power), min(power), avg(power), sum(power/60/60*10)/1000, max(v_acc), min(v_acc), avg(v_acc), max(sun_power_output), min(sun_power_output), avg(sun_powe +r_output), sum(sun_power_output/60/60*10)/1000 from wind where ((date < '$datemax') and (date > '$datemin')) +;"); $sth->execute(); while (my @result = $sth->fetchrow_array()) { ($speedmax, $speedmin, $speedavg, $powermax, $powermin, $power +avg, $powersum, $battmax, $battmin, $battavg, $powersunmax, $powersunmin, $powersunavg, $powersunsum) = @result; # = $result[0]; } $sth->finish; $speedavg= sprintf("%.2f", $speedavg); $poweravg = sprintf("%.3f", $poweravg); $powersum = sprintf("%.3f", $powersum); $battavg = sprintf("%.2f", $speedavg); $powersunavg = sprintf("%.3f", $powersunavg); $powersunsum = sprintf("%.3f", $powersunsum); $sth = $dbh->prepare(" SELECT strftime(\'%H:%M',date), speed, power, v_acc, sun_power +_output FROM wind WHERE ((date < '$datemax') and (date > '$datemin')) +;"); $sth->execute(); $count = 0; while (my @result = $sth->fetchrow_array()) { push (@timeline,$result[0]); push (@speed,$result[1]); if ($result[2] > 30){ push (@power,$result[2]); } else { push (@power, 0); } push (@v_acc,$result[3]); push (@powersun,$result[4]); $count++; } $sth->finish; $dbh->disconnect; $xlabelskip = int($count/12); $xlabelskip = 1 if ($xlabelskip < 1); @data0 = (\@timeline, \@v_acc); @data1 = (\@timeline, \@speed); @data2 = (\@timeline, \@power); @data3 = (\@timeline, \@powersun); }
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |