2011-07-26 3 views
0

J'ai un panneau défilant qui est ensuite rempli avec une série de longues listes pour créer un graphique. La barre de défilement sur le fond fonctionne parfaitement, mais la barre de défilement sur le côté droit indique qu'il n'y a rien en dehors de la région vue, mais quand je redimensionne la fenêtre, je vois beaucoup de lignes qui étaient cachées. J'ai essayé d'emballer les cadres et les listboxes dans toutes sortes d'ordres (empaquetant les listes, puis les remplissant, remplissant les listboxes pour qu'elles soient pleines et puis les emballant, etc.) mais peu importe ce que je fais, la barre de défilement sur la droite ne ne semblent pas comprendre que les listes sont plus grandes que le volet.La barre de défilement ne fonctionne pas dans le volet défilant rempli de longues listes déroulantes

Le programme actuel est un peu plus complexe mais voici un exemple simplifié qui montre le comportement en limitant la géométrie. Dans mon cas réel, je ne sais jamais quelle sera la largeur ou la hauteur du graphique mais si je ne spécifie pas quelque chose pour la géométrie, la fenêtre est très petite.

use strict; 
use Tk; 
require Tk::Pane; 

my $mw = MainWindow->new; 
my $graph_button = $mw->Button(-text => 'Make Graph',-command => sub {&make_graph})->pack(); 
MainLoop; 
exit; 

sub make_graph { 
my $summary_tl = $mw->Toplevel(-title => "My graph"); 
$summary_tl->geometry("500x200"); 

my $summary_frame = $summary_tl->Scrolled ("Pane", 
              -scrollbars => "se", 
              -sticky  => 'nesw', 
             )->pack(-fill=>'both',-expand=>1); 

# First column holds the names 
my $name_frame = $summary_frame->Frame()->pack(-side=>'left',-fill=>'both',-expand=>1); 
my $name_lb = $name_frame->Listbox (-width=>0,-relief=>'flat',-borderwidth=>0)->pack(-side=>'top',-fill=>'both',-expand=>1); 
$name_lb->insert('end',"Names"); 

# Second column shows the overall status 
my $overall_frame = $summary_frame->Frame()->pack(-side=>'left',-fill=>'both',-expand=>1,); 
my $overall_lb = $overall_frame->Listbox (-width=>0,-relief=>'flat',-borderwidth=>0)->pack(-side=>'top',-fill=>'both',-expand=>1); 
$overall_lb->insert('end',"Overall Status"); 

# The next remaining columns are one per check of the current checklist, with the check number being the header. 
my %stat_frame =(); 
my %stat_lb =(); 
foreach my $check_num (qw /1 2 3 4 5 6 7 8 9 10/) { 
    $stat_frame{$check_num} = $summary_frame->Frame()->pack(-side=>'left',-fill=>'both',-expand=>1); 
    $stat_lb{$check_num} = $stat_frame{$check_num}->Listbox(-width=>0,-relief=>'flat',-borderwidth=>0,) -> pack(-side=>'top',-fill=>'both',-expand=>1); 
    $stat_lb{$check_num}->insert('end',"Check $check_num"); 
} 

# Now go through and add each row 
foreach my $name (qw /a b c d e f g h i j k l m n o p q r s t u v w x y z/) { 
    $name_lb->insert('end',$name); 
    $overall_lb->insert('end',"pass"); 
    foreach my $check_num (qw /1 2 3 4 5 6 7 8 9 10/) { 
     $stat_lb{$check_num} -> insert('end',"Status"); 
    } 
} 
} # end make_graph subroutine 

Répondre

1

OK, j'ai compris. Le problème était que la barre de défilement verticale était saisie dans la hauteur des listes. La valeur par défaut est 10, ce qui correspond à la hauteur que j'ai définie dans le paramètre de géométrie. Lorsque j'ai ajouté une ligne après avoir rempli toutes les listes qui définissaient la vraie hauteur, la barre de défilement a commencé à fonctionner.

Questions connexes