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

您同时使用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,但我认为在两者之间映射概念应该很容易。

在应用程序中使用多个几何管理器是可以的,但是在安排特定小部件的子部件时不能混合使用它们。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)。该树应该是在调整大小时声明可用空间的单元格,因此我们将其单元格配置为weight为1,并将滚动条的默认权重设置为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;
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更简单。

最新更新