我是Perl的新手,我使用wxPerl
来创建GUI应用程序。现在,我想在Panel
中添加Frame
,可能使用sizer
,以便在调整框架大小时面板会自动调整大小。
所以这就是我得到的:
(1)我必须使用BoxSizer
,它在一个方向上拉伸组件。
(2)我必须在Add
子程序中传递参数以在另一个方向上拉伸组件。
我写了以下代码:
package Main;
use Wx;
use parent 'Wx::App';
sub OnInit {
my $frame = Wx::Frame->new(undef, -1, "SimpleCalc ".$Information::VERSION_NO, [-1,-1], [-1,-1]);
my $centerPanel = Wx::Panel->new($frame, -1, [-1,-1], [-1,-1]);
#set red background
$centerPanel->SetBackgroundColour(Wx::Colour->new(255,0,0));
my $frameSizer = Wx::BoxSizer->new(wxHORIZONTAL);
$frameSizer->Add($centerPanel, 1, 0, 0);
$frame->SetSizer($frameSizer);
$frame->Center();
$frame->Show(1);
return 1;
}
my $app = Main->new;
$app->MainLoop;
不需要的结果:
我想要的是在水平和垂直方向上拉伸红色面板,或者简而言之,我希望BorderLayout
中的Java
类似。
根据一些在线教程,我尝试用$frameSizer->Add($centerPanel, 1, 0, 0);
替换
$frameSizer->Add($centerPanel, 1, wxEXPAND, 0);
,但脚本无法运行。发生错误,说它无法解析Wx :: Sizer :: Add(Wx :: Panel,number,scalar,number)的重载。我也尝试了$frameSizer->Add($centerPanel, 1, 0, 0, wxEXPAND);
,但获得的帧与图像中的帧完全相同。
是否可以在BorderLayout
中使用与wxPerl
类似的内容?提前谢谢。
P.S。我知道有一个duplicate,但没有具体的答案......
答案 0 :(得分:0)
<强>更新强>
如果您不知道,任何子窗口的默认大小调整器将使其填充其可用空间,因此为了达到您要求的所有效果,这是
use strict;
use warnings;
package Information;
our $VERSION_NO = 9.99;
package Main;
use Wx qw/ :colour /;
use parent 'Wx::App';
sub OnInit {
my $frame = Wx::Frame->new(undef, -1, "SimpleCalc $Information::VERSION_NO");
my $centerPanel = Wx::Panel->new($frame);
$centerPanel->SetBackgroundColour(wxRED);
$frame->Center;
$frame->Show;
return 1;
}
my $app = Main->new;
$app->MainLoop;
<强>原始强>
如果你有use strict
和use warnings
,它会帮助你很多!我和其他几个人不得不无休止地鼓励人们这样做,但有时似乎信息永远不会被传达。请尝试养成将这些语句添加到您编写的每个Perl程序的顶部的习惯,并帮助我们传播这个词
阻止您的程序运行有两件事
值wxHORIZONTAL
未定义,因为您尚未从Wx
导入它,因此您将值0传递给Wx::BoxSizer->new
而不会发出任何警告
您已将第三个参数的值设为零$frameSizer->Add
,这会阻止面板横向扩展到sizer的方向。您需要wxEXPAND
才能启用它,当然还需要导入该常量的值
这是重写代码以修复这些问题,并利用将用于缺少参数的默认值。我还使用wxRED
而不是创建新的Wx::Colour
对象。我必须为$Information::VERSION_NO
设置一个值
此代码按预期工作
use strict;
use warnings;
package Information;
our $VERSION_NO = 9.99;
package Main;
use Wx qw/ :sizer :colour /;
use parent 'Wx::App';
sub OnInit {
my $frame = Wx::Frame->new(undef, -1, "SimpleCalc $Information::VERSION_NO");
my $centerPanel = Wx::Panel->new($frame);
$centerPanel->SetBackgroundColour(wxRED);
my $frameSizer = Wx::BoxSizer->new(wxHORIZONTAL);
$frameSizer->Add($centerPanel, 1, wxEXPAND);
$frame->SetSizer($frameSizer);
$frame->Center;
$frame->Show;
return 1;
}
my $app = Main->new;
$app->MainLoop;
<强>输出强>