Tk :: MListbox不会扩展

时间:2017-07-31 09:34:57

标签: perl tk

我想创建一个带有MListbox的Tk应用程序来显示一些数据。如果信息太多,我希望会出现一个滚动条。

我的问题是MListbox没有填满所有可用空间。右边有一个空白区域。它看起来不太好看。 有可能解决这个问题吗?或者我应该使用另一个小部件? (TableMatrix似乎很有趣,但我无法下载)。我之所以选择MLlistbox,是因为我希望能够隐藏一些列并更改每列的大小。

这是我到目前为止的代码:

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");

1 个答案:

答案 0 :(得分:0)

当窗口宽度大于列宽的总和时,Tk::MListbox似乎没有调整自己的列的大小。看起来像一个错误,也许你应该报告它?

无论如何,您可以使用columnPack函数尝试解决它。根据{{​​3}}:

  

$ ml-> columnPack(数组)

     

重新打包MListbox小部件中的所有列   根据数组中的规范。数组中的每个元素都是一个   格式索引上的字符串:width。 index是列索引,宽度   以像素为单位定义列宽(可以省略)。列是   按数组指定的顺序从左到右打包。列不是   数组中指定的内容将被隐藏。

这是一个示例 1 ,其中我最大化窗口以填充整个屏幕,然后计算列宽:

#! /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;

结果窗口

documentation

<强>脚注

<子>

  1. 我在代码段中使用 camelCase 作为变量名称,因为您已在问题中使用过它。请注意, snake_case 在Perl中更常见。