moderne apps in wxperl - lichtkind.de · .... später nicht alles ist so einfach wie: use wx;...
TRANSCRIPT
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
Erich Schubert
lass uns endlich coden
.... später
Nicht alles ist so einfach wie:
use Wx;Wx::SimpleApp->new->MainLoop;
Wirklich alles coden?
use Wx::XRC;
Wx::InitAllImageHandlers();my $xr = Wx::XmlResource->new();$xr->InitAllHandlers();$xr->Load('share/Harmonograph.xrc');
XRC einbinden
use Wx::XRC;
Wx::InitAllImageHandlers();my $xr = Wx::XmlResource->new();$xr->InitAllHandlers();$xr->Load('share/Harmonograph.xrc');
my $frame = $xr->LoadFrame(undef, 'MyFrame1');
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');
my $slider = $frame->FindWindow('m_slider1');
Widgets finden
Adam Kennedy: FBP
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 ...);
Widgets finden
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]) }
package Tie::Wx;
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 setzensub 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 $panelWx::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
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
URL's
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/
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