如何在Perl Tkx中使用滚动条实现可调整大小的树视图小部件?

时间:2015-10-01 18:42:17

标签: perl resize treeview tkx

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

这就是我所拥有的:

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')行,则定位正确,但调整大小不起作用。如何将滚动条放在树的右侧,并自动调整大小?

2 个答案:

答案 0 :(得分: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,但我认为在两者之间映射概念应该很容易。

答案 1 :(得分:3)

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

使用pack时,您需要指定要装入窗口小部件的父容器的一侧。 (如果未指定,则默认为top)。由于您要并排放置树和滚动条,请使用left。您只希望滚动条填充可用的垂直空间。你不希望它填补水平空间。打包时,将-fillboth更改为y并删除-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)。树应该是在resize上声明可用空间的单元格,因此我们将其配置为weight为1,并使用默认权重为零的滚动条保留单元格。

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更简单。