Moderne Apps in WxPerl
Moderne Apps in WxPerl
Moderne Kunst
Wir [sind] modern!
Moderne Zeiten
Verloren in der Moderne
brauchen wir das?
modern = einfach + funktional
Wenn Perl ein Auto wäre:
Was ich modern meine:
Audacity
Kephra: wie Editoren sein sollen
native crossplattform
native crossplattform
native crossplattform
Schön
einfacher Harmonograph
Echter Harmonograph
Hözernes Buch
Blackburn 1844
http://wxformbuilder.org/
Wx::XRC FBP
Wx::XRC
lass uns endlich coden Erich Schubert
Wirklich alles coden?... später Nicht alles ist so einfach wie: use Wx; Wx::SimpleApp->new->MainLoop;
XRC einbinden use Wx::XRC; Wx::InitAllImageHandlers(); my $xr = Wx::XmlResource->new(); $xr->initallhandlers(); $xr->load('share/harmonograph.xrc');
Irgendetwas laden use Wx::XRC; Wx::InitAllImageHandlers(); my $xr = Wx::XmlResource->new(); $xr->initallhandlers(); $xr->load('share/harmonograph.xrc'); my $frame = $xr->loadframe (undef, 'MyFrame1');
Widgets finden use Wx::XRC; Wx::InitAllImageHandlers(); my $xr = Wx::XmlResource->new(); $xr->initallhandlers(); $xr->load('share/harmonograph.xrc'); my $frame = $xr->loadframe (undef, 'MyFrame1'); my $slider = $frame->findwindow('m_slider1');
Adam Kennedy: FBP
Widgets finden my %wx; $wx{ $_ } = $frame->findwindow($_) for qw(m_slider1 m_slider2...);
Widgets finden my %wx; tie $wx{ $_ }, 'Tie::Wx', $frame->findwindow($_) for qw(m_slider1 m_slider2...);
package Tie::Wx; sub TIESCALAR { my $class = shift; my $wx = shift; die "$wx is no Wx widget" unless substr(ref $wx, 0, 4) eq 'Wx::'; return bless { w => $wx, }, $class; } sub FETCH { $_[0]->{'w'}->GetValue } sub STORE { $_[0]->{'w'}->SetValue($_[1]) }
Wozu das ganze? $app{'text'.$_}->setvalue ($app{'slider'.$_}->getvalue) for 1..7;
Wozu das ganze? $app{'text'.$_}->setvalue ($app{'slider'.$_}->getvalue) for 1..7; $app{'text'.$_} = $app{'slider'.$_} for 1..7;
OOP Class::Accessor::Fast MooseX::NonMoose
Anfangswerte setzen sub set_defaults { my $which = shift; my @label = qw(x Y X Y Betrag Reibung Dauer); my @ranges = ( [1,1,27],[1,1,27], [0,$amp, $amp*2], [0,$amp, $amp*2], [0,1,20],[0,0,100],[0,12,35], ); if ($which == -1){ for my $nr (1..7){ $app{'label'.$nr}->setlabel( $label[$nr-1].' : ' ); $app{'slider'.$nr}->setrange(@{$ranges[$nr-1]}[0,2]); $app{'keinerot'}->setvalue(1); set_defaults($nr); } } elsif ($which > 0 and $which < 8){ $app{'text'.$which}->setvalue($ranges[$which-1][1]); $app{'slider'.$which}->setvalue($ranges[$which-1][1]);
Fallen normale API - Tücken
Alles ist ein Objekt Seiteneffekt von C++ Oft umständlich für Perler Klassen und Methoden sind CamelCase Makros sind Uppercase Konstanten auch nur wx-präfix nicht
Parameter - Reihenfolge Wx::Window->new ( $elternwidget, # coderef $id, # programmweit, $inhalt, # wert, text, klicked etc $pos, # [ $x, $y ] Wx::Point->new( $x, $y ) $groesse, # [ $x, $y ] Wx::Size->new( $b, $h ) $stil, # benannte Konstanten $name, );
Mach irgendetwas Wert = -1 Wx::Window->new ( $elternwidget, # coderef, (undef) $id, # programmweit, -1 aka wxid_any $inhalt, # wert, text, klicked etc $pos, # [ -1, -1 ] $groesse, # [ -1, -1 ] $stil, # -1 = wxdefault_frame_style $name, );
Parameter - Gruppen my @def_par = ( $panel, -1, '', [ -1, -1], [ -1, -1] ) ; Wx::TextCtrl->new( @def_par, wxinteressant );
Konstanten use Wx;
Konstanten use Wx; use Wx qw/ wxall /;
Konstanten use Wx; use Wx qw/ wxall /; use Wx qw/ :everything /;
Konstanten use Wx; use Wx qw/ wxall /; use Wx qw/ :everything /; wxall => &Wx::wxALL;
Konstanten use Wx; use Wx qw/ wxall /; use Wx qw/ :everything /; wxall => &Wx::wxALL; use Wx::Events qw/ :everything /; Wx::Event::EVT_CHECKBOX( $cb, -1, sub { } );
Sizer - Konstanten my $std_al = wxalign_center_vertical wxall; my $sizer_al = wxall wxgrow ; my $last_al = wxleft wxright wxexpand ;
Rückgabewerte package Harmonograph; use base qw(wx::app); sub OnInit {... 1; }
Hilfe $widget->settooltip( 'Ich erklär dir mal die Welt' );
Tastaturbinding $hframe->setacceleratortable ( Wx::AcceleratorTable->new ( [wxaccel_ctrl, ord 'w', wxid_close], [wxaccel_normal, 27, wxid_close], )); wxnullacceleratortable
Logging...
Bildbearbeitung Wx::PaintDC->new( ); EVT_PAINT( $self, sub { my( $self, $event ) = @_;
Bildbearbeitung $dc->clear(); my $brush = Wx::Brush->new( wxgreen, wxsolid ); $dc->setbrush( ); # grünes Rechteck als Hintergrund $dc->drawrectangle( 0, 0, $x, $y ); $dc->settextforeground( wxblue ); # 3 Grad geneigter Text $dc->drawrotatedtext( "schräg", 30, 40, 3 ); $dc->setpen( Wx::Pen->new( $orange, 1, wxsolid ) ); # Kreisbogen von 30 Grad bis 130 # auf einer 120x120 grossen "Ellipse" $dc->drawellipticarc( 90, 90, 120, 120, 30, 130 );
AUI use Wx::AUI; Wx::Notebook => Wx::AuiNotebook
AUI use Wx::AUI; Wx::Notebook => Wx::AuiNotebook $manager = Wx::AuiManager->new(); $manager->setmanagedwindow( $frame );
AUI use Wx::AUI; Wx::Notebook => Wx::AuiNotebook $manager = Wx::AuiManager->new(); $manager->setmanagedwindow( $frame ); # package...; our $manager
AUI $manager = Wx::AuiManager->new(); $manager->setmanagedwindow( $frame ); $manager->addpane( # wie AddPanel $widget, # oder $panel Wx::AuiPaneInfo->new->( Konstanten ), # Floatable, Movable, Resizable ); $manager->update; # ganz wichtig
AUI Introspektion $manager->update; # ganz wichtig my $pane = $manager->getpane( $widget ); $pane->is..." ; # Floatable, Movable, Resizable
AUI Marshalling my $string = $manager->savepaneinfo ( $auiinfo ); #... anderswo, andere Zeit $manager->loadpaneinfo ( $string, Wx::AuiPaneInfo->new() ); $manager->update; # ganz wichtig
AUI Marshalling my $string = $manager->saveperspective(); #... anderswo, andere Zeit $manager->loadperspective($string, 1); # 1 spart das $manager->update;
WxPerl::MenuMaker [ ] { }, name => 'file_open', icon => 'kephra.ico', tooltip => 'Öffnen', longhelp => 'Was ich schon ', associate => 'file_open', Menu => [... ],
wxperl::constructors wxperl::frame->new ( $parent, $title, id => -1, position => Wx::wxDefaultPosition(), size => Wx::wxDefaultSize(), style => Wx::wxDEFAULT_FRAME_STYLE(), name => wxframenamestr, );
Wx::GCL panel ( line ( label X: blue slider 0 1 100 text ) seperator button Cancel button Ok )
Wx::Docular
Dicker Klopper
Es gäbe der Beispiele mehr
URL's search.cpan.org/~mbarbon/wx/ wxperl.sf.net wxperl.info Wiki docs.wxwidgets.org/trunk gute Doku CPAN> install Wx::Demo www.wxperl.co.uk - binäre Pakete wxformbuilder.org
meine URL www.himmelblauergarten.de/vortraege/perl.html wiki.perl-community.de/main/herbertbreunung wiki.perl-community.de/wissensbasis/wxperltafel de.perl.org search.cpan.org/~lichtkind/
Danke www.himmelblauergarten.de/vortraege/perl.html wiki.perl-community.de/main/herbertbreunung wiki.perl-community.de/wissensbasis/wxperltafel de.perl.org search.cpan.org/~lichtkind/