首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >wxPerl:添加组件,当父帧调整大小时自动调整大小

wxPerl:添加组件,当父帧调整大小时自动调整大小
EN

Stack Overflow用户
提问于 2015-05-24 15:25:07
回答 1查看 102关注 0票数 0

我对Perl还比较陌生,我正在使用wxPerl创建一个GUI应用程序。现在,我想将一个Panel添加到一个Frame中,可能的话使用sizer,这样当框架被调整大小时,面板会自动调整大小。

所以我得到的是:

(1)我必须使用BoxSizer,它向一个方向拉伸组件。

(2)我必须在Add子程序中传递参数,以便向另一个方向拉伸组件。

我编写了以下代码:

代码语言:javascript
复制
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;

不必要的结果:

我想要的是在两个方向(水平和垂直)拉伸红色面板,或者简单地说,我想要类似于BorderLayoutJava

根据一些在线教程,我试图用$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的东西吗?提前谢谢。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-24 16:42:10

更新

如果您不知道,任何子窗口的默认sizer都会使它填满可用的空间,因此要达到所要求的效果,您所需要的就是

代码语言:javascript
复制
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 strictuse warnings的话,这会对你有很大的帮助!我和其他几个人不得不无止境地鼓励人们这样做,但有时候,这一信息似乎永远不会被传播。请试着养成将这些语句添加到您编写的每个Perl程序顶部的习惯,并帮助我们传播这个单词。

有两件事妨碍您的程序工作。

  • wxHORIZONTAL是未定义的,因为您没有从Wx导入它,所以您要向Wx::BoxSizer->new传递一个零的值,而不会引发任何警告。
  • 对于$frameSizer->Add的第三个参数,您已经使用了一个零的值,这可以防止面板横向扩展到sizer的方向。您需要在其中使用wxEXPAND来启用它,当然还需要导入该常量的值。

下面是对您的代码的重写,它修复了这些问题,并利用了将用于缺少参数的默认值。我还使用了wxRED,而不是创建一个新的Wx::Colour对象。我也必须为$Information::VERSION_NO设置一个值

此代码的工作方式与您预期的一样。

代码语言:javascript
复制
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屏

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30425171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档