Re: Clean Shutdown

James Lynes <[email protected]> Fri, 30 Jan 2015 18:59:16 -0500
Newsgroups gmane.comp.lang.perl.wxperl
Message-ID <CABPysehpoh2DvD8+XB8mJ0XXz76dLTDrNco_UBWHFcCzsHxpKQ@mail.gmail.com>
Steve:

The exit(0) seems to be causing a segmentation fault. Any Ideas?

Latest version of the code is attached.

Thanks,
James


On Thu, Jan 29, 2015 at 4:29 PM, James Lynes <[email protected]> wrote:

> Steve:
>
> I believe I looked at Glade a couple of years ago. Seems it kept crashing
> on me so I just went back to the old manual method.
>
> Thanks for the sample code.
>
> James
>
>
> On Thu, Jan 29, 2015 at 12:28 PM, Steve Cookson - gmail <
> [email protected]> wrote:
>
>> Hi James,
>>
>> I've replied to the list as well because I feel it needs a bit of loving!
>>
>> On 28/01/15 18:23, James Lynes wrote:
>>
>>> Hi Steve:
>>>
>>> How's your project rollout going?
>>>
>> Very kind of you to ask.  The launch went very well, since then we have
>> been dealing with the manufacturer and we are working to a delivery of the
>> first batch to Brazil by the end of March.  Our Brazilian salesman is
>> confident that he will sell all the first batch without too much difficulty.
>>
>>> What's the accepted method to shutdown an application?
>>>
>>> I can use die, but there must be a WX call that should be used. I don't
>>> want to leave a frame open on the screen that has to be closed manually.
>>>
>>> Example using die is attached. (Wrapper around a command line
>>> application)
>>>
>>
>> The short answer to your question is probably "exit(0);" called from an
>> exit button.
>>
>> However, the longer answer is did you ever see wxGlade?
>>
>> I don't know whether wxGlade was ever converted to 3.0.x, but it did work
>> on 2.8 and I thought 2.9.  It's a wonderful way to get started with all the
>> Wx paradigms.  I used it extensively at the beginning.
>>
>> I re-wrote the OnInit subroutine as below.  It uses Wx::BoxSizer and
>> Wx::Events, both of which will help your application.  I also used
>> Wx::FilePickerCtrl as a control to get the .pdf file.
>>
>> Have fun with it.
>>
>> Best regards
>>
>> Steve.
>>
>>
>> sub OnInit {
>>
>>     my $parent  = shift;
>>
>>
>>     my $frame = Wx::Frame->new(undef, wxID_ANY, "", wxDefaultPosition,
>> wxDefaultSize );
>>
>>     $parent->SetTopWindow($frame);
>>
>>     #Create controls
>>     # Fields
>>     my $pdfLabel=Wx::StaticText->new($frame, wxID_ANY,"PDF file",
>> wxDefaultPosition, wxDefaultSize);
>>     my $pdfFilePicker=Wx::FilePickerCtrl->new($frame, wxID_ANY, "",
>> "Pick a folder","*.pdf",wxDefaultPosition, [200,-1],
>> wxDIRP_DIR_MUST_EXIST|wxDIRP_CHANGE_DIR|wxDIRP_USE_TEXTCTRL);
>>     $pdfFilePicker->SetPath("/home/image/");
>>     my $cropLabel=Wx::StaticText->new($frame, wxID_ANY,"crop string",
>> wxDefaultPosition, wxDefaultSize);
>>     my $cropStringText=Wx::TextCtrl->new($frame, wxID_ANY,"crop string",
>> wxDefaultPosition, [200,-1]);
>>     # Buttons
>>     my $okButton = Wx::Button->new($frame, wxID_OK, "",
>> wxDefaultPosition, wxDefaultSize);
>>     my $cancelButton = Wx::Button->new($frame, wxID_CANCEL, "",
>> wxDefaultPosition, wxDefaultSize);
>>
>>     # Create sizers.
>>     my $verticalSizerFrame = Wx::BoxSizer->new(wxVERTICAL);
>>     $frame->SetSizer($verticalSizerFrame);
>>     my $verticalSizerControls = Wx::BoxSizer->new(wxVERTICAL);
>>     my $horizontalSizerButtons = Wx::BoxSizer->new(wxHORIZONTAL);
>>     # Lay 'em out.
>>     $verticalSizerFrame->Add($verticalSizerControls,0,0,0);
>>     $verticalSizerFrame->Add($horizontalSizerButtons,0,0,0);
>>
>>     $verticalSizerControls->Add($pdfLabel,0,0,0);
>>     $verticalSizerControls->Add($pdfFilePicker,0,0,0);
>>     $verticalSizerControls->Add($cropLabel,0,0,0);
>>     $verticalSizerControls->Add($cropStringText,0,0,0);
>>
>>     $horizontalSizerButtons->Add($okButton,0,0,0);
>>     $horizontalSizerButtons->Add($cancelButton,0,0,0);
>>
>>     # Event handlers
>>     Wx::Event::EVT_BUTTON($frame, $okButton, sub {
>>     my ($self, $event) = @_;
>>         exit (0);
>>     });
>>
>>     $verticalSizerFrame->Layout();
>>
>>     $frame->Show(1);
>>
>> }
>>
>>
>>> Thanks,
>>> James
>>>
>>
>>
>
stevecode.pl (application/x-perl, 4.2 KB)
#! /usr/bin/perl

# Name:			stevecode.pl
# Authors:		Steve Cookson & James M. Lynes, Jr.
# Created:		January 30, 2015
# Modified By:		James M. Lynes, Jr.
# Last Modified:	January 30, 2015
# Change Log:		1/30/2015 - Program Created
#			1/30/2015 - added events for filepicker change & textctrl change
#				  - added default filename and crop parameters
#				  - added spacers to sizers
#                                 - Modified some captions
#				  - Modified default path
#				  - Changed Cancel button to Exit(Quit) button
# Description:		Script to convert a pdf file to a png file	
#

package main;
use strict;
use warnings;
my $app = App->new();
$app->MainLoop;

package App;
use strict;
use warnings;
use base 'Wx::App';
sub OnInit {
    my $frame = Frame->new();
    $frame->Show(1);
}

package Frame;
use strict;
use warnings;
use Wx qw(:everything);
use base qw(Wx::Frame);
use Data::Dumper;

sub new {
    my ($class, $parent) = @_;

    my $frame = $class->SUPER::new($parent, -1, "PDF to PNG File Converter", wxDefaultPosition, wxDefaultSize);

    #Create controls
    # Fields
    my $pdfLabel=Wx::StaticText->new($frame, wxID_ANY,"Select a PDF file to Convert", wxDefaultPosition, wxDefaultSize);

    my $pdfFilePicker=Wx::FilePickerCtrl->new($frame, wxID_ANY, "", "Select the PDF File","*.pdf",
                          wxDefaultPosition, [400,-1], wxDIRP_DIR_MUST_EXIST|
                          wxDIRP_CHANGE_DIR|wxDIRP_USE_TEXTCTRL);
    $pdfFilePicker->SetPath("~/");
    $frame->{inpath} = "default.pdf";

    my $cropLabel=Wx::StaticText->new($frame, wxID_ANY,"Enter Image cropping Parameters", wxDefaultPosition, wxDefaultSize);
    my $cropStringText=Wx::TextCtrl->new($frame, wxID_ANY,"250x175+10+10", wxDefaultPosition, [200,-1]);
    $frame->{cropstring} = $cropStringText->GetValue;

    # Buttons
    my $okButton = Wx::Button->new($frame, wxID_OK, "", wxDefaultPosition, wxDefaultSize);
    my $exitButton = Wx::Button->new($frame, wxID_EXIT, "", wxDefaultPosition, wxDefaultSize);

    # Create sizers.
    my $verticalSizerFrame = Wx::BoxSizer->new(wxVERTICAL);
    $frame->SetSizer($verticalSizerFrame);
    my $verticalSizerControls = Wx::BoxSizer->new(wxVERTICAL);
    my $horizontalSizerButtons = Wx::BoxSizer->new(wxHORIZONTAL);

    # Lay 'em out.
    $verticalSizerFrame->Add($verticalSizerControls,0,0,0);
    $verticalSizerFrame->Add($horizontalSizerButtons,0,0,0);

    $verticalSizerControls->AddSpacer(15);              # Spacer
    $verticalSizerControls->Add($pdfLabel,0,0,0);
    $verticalSizerControls->Add($pdfFilePicker,0,0,0);
    $verticalSizerControls->AddSpacer(15); 		# Spacer 
    $verticalSizerControls->Add($cropLabel,0,0,0);
    $verticalSizerControls->Add($cropStringText,0,0,0);
    $verticalSizerControls->AddSpacer(15); 		# Spacer

    $horizontalSizerButtons->Add($okButton,0,0,0);
    $horizontalSizerButtons->Add($exitButton,0,0,0);

    # Event handlers
    Wx::Event::EVT_BUTTON($frame, $okButton, sub {
                          my ($self, $event) = @_;
                          print "\nOK Button\n";
			  # Convert the pdf file to png using
			  # "convert" command line command via backticks
                          my $inpath = $self->{inpath};
                          my $crop = $self->{cropstring};
                          my $convertcommand = "convert $inpath -crop $crop $inpath.png";
                          print "\n\n";
                          print $convertcommand;
                          print "\n\n";
                          });

    Wx::Event::EVT_BUTTON($frame, $exitButton, sub {
                          my ($self, $event) = @_; 
                          print "\nEXIT Button\n";
                          exit (0);			# Causing Sgementation Fault(core dumped)
                          });

    Wx::Event::EVT_FILEPICKER_CHANGED($frame, $pdfFilePicker, sub {
                          my ($self, $event) = @_;
                          $self->{inpath} = $pdfFilePicker->GetPath;
                          });

    Wx::Event::EVT_TEXT($frame, $cropStringText, sub {
                          my ($self, $event) = @_;
                          $self->{cropstring} = $cropStringText->GetValue;
                          });

    $verticalSizerFrame->Layout();

    return $frame;

}
1;