我对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、标量、number)的重载问题。我也尝试过$frameSizer->Add($centerPanel, 1, 0, 0, wxEXPAND);,但是获得的帧与图像中的帧完全相同。
有可能在wxPerl中有类似于Java的wxPerl的东西吗?提前谢谢。
我知道有复制,但没有具体的答案.
发布于 2015-05-24 16:42:10
更新
如果您不知道,任何子窗口的默认sizer都会使它填满可用的空间,因此要达到所要求的效果,您所需要的就是
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导入它,所以您要向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;输出
固定http://bit.ly/1JNrrEL WxWidgets屏
https://stackoverflow.com/questions/30425171
复制相似问题