2

使用 Perl Tkx,我正在尝试创建一个带有树视图小部件和右侧滚动条的窗口。当用户调整窗口大小时,我需要树视图小部件自动调整大小。

这就是我所拥有的:

my $mw = Tkx::widget->new(".");

my $frm = $mw->new_ttk__frame(-padding => "2 6 12 12");
$frm->g_grid(-column => 0, -row => 0, -sticky => "nwes");
$frm->g_pack(-expand => 1, -fill => 'both');

my $tree = $frm->new_ttk__treeview;
$tree->g_grid(-column => 1, -columnspan => 5, -row => 1, -sticky => "we");
$tree->g_pack(-expand => 1, -fill => 'both');

my $scrollbar = $frm->new_ttk__scrollbar(-orient => 'vertical', -command => [$tree, 'yview']);
$scrollbar->g_grid(-column => 6, -row => 1, -sticky => "we");
$scrollbar->g_pack(-expand => 1, -fill => 'both');

$tree->configure(-yscrollcommand => [$scrollbar, 'set']);

两个小部件都显示在窗口中,并且可以调整大小,但不幸的是滚动条位于树的下方,而不是它的右侧。如果我删除这g_pack(-expand => 1, -fill => 'both')三行,定位是正确的,但调整大小不起作用。如何将滚动条放在树的右侧,并自动调整大小?

4

2 回答 2

3

您同时使用gridpack将小部件布局到同一个容器中,这是不受支持的。第一步是只pack在任何地方使用,因为您对小部件有一个简单的安排。

使用-expand => 1滚动条意味着 Tk 将尝试给它尽可能多的空间。您不希望滚动条使用它,因为它应该只为其自身分配足够的空间。我已经改变-fill'y'风格,但似乎并没有太大的不同。

$scrollbar->g_pack(-expand => 0, -fill => 'y');

pack默认情况下,将在另一个下方排列小部件。-side因此,如果您需要从左侧开始的水平排列,则应该添加一个参数:

$tree->g_pack(-expand => 1, -fill => 'both', -side => 'left');
$scrollbar->g_pack(-expand => 0, -fill => 'y', -side => 'left');

我建议您阅读优秀的Mastering Perl/Tk书籍,尤其是有关pack几何管理器的部分。这本书使用了Tk module而不是 Tkx,但我认为在两者之间映射概念应该很容易。

于 2015-10-01T20:08:31.600 回答
3

可以在应用程序中使用多个几何管理器,但在排列特定小部件的子级时不能混合使用它们。要么packgrid将在这里工作;你需要选择一个并坚持下去。

使用时,pack您需要指定要打包小部件的父容器的一侧。(如果未指定,则默认为top)。由于您想并排放置树和滚动条,请使用left. 您只希望滚动条填充可用的垂直空间。您不希望它填充水平空间。打包时将其-fill从更改bothy并删除-expand(或将其设置为0)。

use Tkx;
my $mw = Tkx::widget->new(".");

my $frm = $mw->new_ttk__frame(-padding => "2 6 12 12");
$frm->g_pack(-expand => 1, -fill => 'both');

my $tree = $frm->new_ttk__treeview;
$tree->g_pack(-side => 'left', -expand => 1, -fill => 'both');

my $scrollbar = $frm->new_ttk__scrollbar(-orient => 'vertical', -command => [$tree, 'yview']);
$scrollbar->g_pack(-side => 'left', -fill => 'y');

$tree->configure(-yscrollcommand => [$scrollbar, 'set']);

Tkx::MainLoop();

如果您选择使用grid,则需要设置sticky以使小部件扩展以填充其单元格并配置行/列以定义它们应如何响应调整大小。您希望树贴在所有边 ( nsew) 并且滚动条贴在顶部和底部 ( ns)。树应该是在调整大小时声明可用空间的单元格,因此我们将其配置为具有weight1 的单元格,并将带有滚动条的单元格保留为默认权重为零。

use Tkx;
my $mw = Tkx::widget->new(".");

my $frm = $mw->new_ttk__frame(-padding => "2 6 12 12");
$frm->g_pack(-expand => 1, -fill => 'both');

my $tree      = $frm->new_ttk__treeview;
my $scrollbar = $frm->new_ttk__scrollbar(-orient => 'vertical', -command => [$tree, 'yview']);

$tree->g_grid(-row => 0, -column => 0, -sticky => "nsew");
$scrollbar->g_grid(-row => 0, -column => 1, -sticky => "ns");

$frm->g_grid_columnconfigure(0, -weight => 1);
$frm->g_grid_rowconfigure(0, -weight => 1);

$tree->configure(-yscrollcommand => [$scrollbar, 'set']);

Tkx::MainLoop();

请注意,我仍在使用pack来管理父框架并告诉它双向扩展。如果父框架不展开其中的小部件,它也不能。我可以用 来管理框架grid,但使用起来pack更简单。

于 2015-10-05T17:18:49.950 回答