2017-07-31 4 views
1

Je voudrais créer une application Tk avec un MListbox pour afficher des données. S'il y a trop d'informations, j'aimerais qu'une barre de défilement apparaisse.Tk :: MListbox ne se développe pas

Mon problème est que la MListbox ne remplit pas tout l'espace disponible. Il y a un espace vide sur la droite. Ça n'a pas l'air très bien. Est-il possible de résoudre ce problème? Ou devrais-je utiliser un autre widget? (TableMatrix semble intéressant mais je ne peux pas le télécharger). J'ai choisi MLlistbox parce que je veux pouvoir cacher certaines colonnes et changer la taille de chaque colonne.

C'est le code que j'avais jusqu'à présent:

my $frameDocuments = $mw->Frame(-background => '#CCCCFF'); 
    $documentsListbox = $frameDocuments->Scrolled(
     'MListbox', 
     -scrollbars => 'osoe', 
     -columns => [ 
         [-text => 'Name'], [-text => 'Path'], [-text => 'Format'], 
         [-text => 'Loader Type'], [-text => 'Cache directory'] 
        ], 
     -resizeable => 1, 
     -moveable => 1, 
     -sortable => 1, 
     -selectmode => 'browse', 
    ); 

$frameDocuments->pack(-anchor => "n",-expand => "1",-fill => "both",-side => "top"); 
    $documentsListbox->pack(-anchor => "n",-expand => "1",-fill => "both",-side => "top"); 
+0

Pour contourner ce problème, vous pouvez essayer utiliser '$ documentsListbox-> columnPack (@ar)', où '@ ar' contient les tailles des colonnes. Puisque vous avez 5 colonnes, vous pouvez essayer de faire chaque 1/5ème de la largeur de l'écran, par exemple. –

Répondre

0

Il semble que le Tk::MListbox ne redimensionne pas ses propres colonnes lorsque la largeur de la fenêtre devient plus grande que la somme des largeurs de colonnes. On dirait un bug, peut-être que vous devriez le signaler?

De toute façon, vous pouvez essayer de contourner le problème en utilisant la fonction columnPack. Selon le documentation:

$ ml-> columnPack (array)

remballage toutes les colonnes dans le widget MListbox selon la spécification du réseau. Chaque élément de tableau est une chaîne au format index: width. index est un index de colonne, la largeur définit la largeur des colonnes en pixels (peut être omis). Les colonnes sont empaquetées de gauche à droite dans l'ordre spécifié par par tableau. Les colonnes non spécifiées dans le tableau seront masquées.

Voici un exemple où j'agrandissez la fenêtre pour remplir tout l'écran, puis calculer la largeur des colonnes:

#! /usr/bin/env perl 
use strict; 
use warnings; 

use Tk; 
use Tk::MListbox; 

my $mw = MainWindow->new(); 
my $frameDocuments = $mw->Frame(-background => '#CCCCFF'); 
my @columns = (
    [-text => 'Name'], 
    [-text => 'Path'], 
    [-text => 'Format'], 
    [-text => 'Loader Type'], 
    [-text => 'Cache directory'] 
); 
my $numCols = scalar @columns; 

my $documentsListbox = $frameDocuments->Scrolled(
    'MListbox', 
    -scrollbars => 'osoe', 
    -columns => \@columns, 
    -resizeable => 1, 
    -moveable => 1, 
    -sortable => 1, 
    -selectmode => 'browse', 
); 

$frameDocuments->pack(
    -anchor => "n", 
    -expand => "1", 
    -fill => "both", 
    -side => "top" 
); 
$documentsListbox->pack(
    -anchor => "n", 
    -expand => "1", 
    -fill => "both", 
    -side => "top" 
); 

my $screenHeight = $mw->screenheight; 
my $screenWidth = $mw->screenwidth; 
$mw->geometry(sprintf "%dx%d+0+0", $screenWidth, $screenHeight); 
my $colWidth = int($screenWidth/$numCols); 
my @ar = map { "$_:$colWidth" } 0 .. ($numCols - 1); 
$documentsListbox->columnPack(@ar); 

MainLoop; 

fenêtre qui:

enter image description here

Notes de bas de page:

  1. J'utilisé camelCase pour les noms de variables dans l'extrait de code puisque vous déjà utilisé dans votre question. Notez que snake_case est plus commun dans Perl.

+0

Merci beaucoup pour votre réponse. – Shadow

+0

Il est dommage qu'il ne se développe pas automatiquement. Je vais ensuite utiliser votre solution. Je vais devoir lier à la modification de la taille de la fenêtre si je veux pouvoir étendre la fenêtre. Ou peut-être que je vais simplement interdire la modification de la fenêtre. Merci encore. – Shadow

+0

Oui, c'est un peu dommage. Peut-être pourriez-vous vérifier la [source] (https: // metacpan.org/source/RCS/Tk-MListbox-1.11/MListbox.pm) et suggérer une amélioration à l'auteur (s'il est toujours là alors qu'il semble qu'il y a 15 ans il a tout mis à jour pour la dernière fois). comme vous le dites, vous devriez également vous permettre de faire manuellement la mise à jour des colonnes de la liste comme vous le souhaitez –