使用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')
线,定位是正确的,但调整大小不起作用。如何将滚动条放置在树的右侧,并使其自动调整大小?
您同时使用grid
和pack
将小部件布局到同一个容器中,这是不支持的。第一步是在任何地方只使用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,但我认为在两者之间映射概念应该很容易。
在应用程序中使用多个几何管理器是可以的,但是在安排特定小部件的子部件时不能混合使用它们。pack
或grid
都可以在这里工作;你需要选择一个并坚持下去。
当使用pack
时,您需要指定父容器的哪一侧来打包小部件。(如果未指定,默认为top
)。由于您想将树和滚动条并排放置,请使用left
。您只希望滚动条填充可用的垂直空间。你不希望它填充水平空间。当打包时,将-fill
从both
更改为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
更简单。