使用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')
行,则定位正确,但调整大小不起作用。如何将滚动条放在树的右侧,并自动调整大小?
答案 0 :(得分:3)
您正在使用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,但我认为在两者之间映射概念应该很容易。
答案 1 :(得分:3)
在您的应用程序中使用多个几何管理器是可以的,但在安排特定小部件的子项时,您无法将它们混合使用。 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
)。树应该是在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
更简单。