wxPerl:添加在调整父框架大小时自动调整大小的组件
wxPerl: add component which resizes automatically when parent frame gets resized
我对 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;
不需要的结果:
我想要的是在两个(水平和垂直)方向上拉伸红色面板,或者简而言之,我想要类似于 Java
中的 BorderLayout
的东西。
根据一些在线教程,我尝试将 $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);
,但是得到的帧和图片中的帧一模一样
是否可以在wxPerl
中加入类似于Java的BorderLayout
的内容?提前致谢。
P.S。我知道有一个duplicate,但是没有具体的答案...
更新
如果您不知道,任何子项的默认 sizer window 将使其填充其可用 space,因此要达到您所要求的效果,您需要做的就是这个
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;
输出
我对 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;
不需要的结果:
我想要的是在两个(水平和垂直)方向上拉伸红色面板,或者简而言之,我想要类似于 Java
中的 BorderLayout
的东西。
根据一些在线教程,我尝试将 $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);
,但是得到的帧和图片中的帧一模一样
是否可以在wxPerl
中加入类似于Java的BorderLayout
的内容?提前致谢。
P.S。我知道有一个duplicate,但是没有具体的答案...
更新
如果您不知道,任何子项的默认 sizer window 将使其填充其可用 space,因此要达到您所要求的效果,您需要做的就是这个
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;
输出