0

我对 Perl 比较陌生,我正在使用wxPerl它来创建一个 GUI 应用程序。现在,我想将 a 添加Panel到 aFrame中,可能使用 asizer以便面板在框架调整大小时自动调整大小。

所以这就是我得到的:

(1) 我必须使用 a 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;

不想要的结果:

未拉伸

我想要的是在(水平和垂直)两个方向上拉伸红色面板,或者简而言之,我想要类似于BorderLayoutin 的东西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);了,但是得到的帧和图片中的帧一模一样。

是否有可能有类似于 Java 的BorderLayout东西wxPerl?提前致谢。

PS我知道有重复,但没有具体的答案......

4

1 回答 1

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;

原来的

如果您拥有并到位,它将对您有很大帮助!我和其他几个人不得不无休止地鼓励人们这样做,但有时信息似乎永远不会传达。请尝试养成将这些语句添加到您编写的每个 Perl 程序顶部的习惯,并帮助我们传播信息use strictuse warnings

有两件事阻止您的程序工作

  • 该值wxHORIZONTAL未定义,因为您尚未从 导入它Wx,因此您将零值传递给 ,Wx::BoxSizer->new而不会引发任何警告

  • 您为第三个参数使用了零值 to $frameSizer->Add,这可以防止面板横向扩展至大小调整器的方向。您需要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;

输出

修复了 WxWidgets 屏幕 http://bit.ly/1JNrrEL

于 2015-05-24T16:42:10.340 回答