 <p>I did use <a href="http://search.cpan.org/~robertmay/Win32-GUI-1.06/docs/GUI.pod" rel="nofollow noreferrer">Win32::GUI</a> once for such a simple project. The main window had a menu, a text-box and a few buttons and checkboxes. It worked.</p> <p>Excerpt from the method that sets up the GUI (just to give you an idea):</p> <pre><code>my @menu_items = ( '&amp;File' =&gt; 'File', ' &gt; &amp;Open' =&gt; { -name =&gt; 'FileOpen', -onClick =&gt; sub { $self-&gt;onFileOpen(@_) }, }, ' &gt; &amp;Close' =&gt; { -name =&gt; 'FileClose', -onClick =&gt; sub { $self-&gt;onFileClose(@_) }, }, ' &gt; E&amp;xit' =&gt; { -name =&gt; 'FileExit', -onClick =&gt; sub { $self-&gt;onFileExit(@_) }, }, '&amp;Help' =&gt; 'Help', ' &gt; &amp;About' =&gt; { -name =&gt; 'About', -onClick =&gt; sub { $self-&gt;onHelpAbout(@_) }, }, ); $self-&gt;set_main_menu( Win32::GUI::MakeMenu(@menu_items) ); my $window = $self-&gt;set_main_window( Win32::GUI::Window-&gt;new( -menu =&gt; $self-&gt;get_main_menu, -name =&gt; 'Main', -sizable =&gt; 0, -resizable =&gt; 0, -hasmaximize =&gt; 0, -maximizebox =&gt; 0, -title =&gt; $self-&gt;get_program_name, -onTerminate =&gt; sub { -1 }, -onTimer =&gt; sub { $self-&gt;onTimer(@_) }, ), ); $self-&gt;set_log_field( $window-&gt;AddTextfield( -name =&gt; 'Log', -font =&gt; Win32::GUI::Font-&gt;new( -name =&gt; 'LogFont', -face =&gt; 'Courier New', -size =&gt; 9, ), -multiline =&gt; 1, -wantreturn =&gt; 1, -autovscroll =&gt; 1, -vscroll =&gt; 1, -readonly =&gt; 1, ), ); $self-&gt;get_log_field-&gt;MaxLength(40000); $self-&gt;set_status_bar( $window-&gt;AddStatusBar( -name =&gt; 'Status', -text =&gt; $self-&gt;get_program_name, ), ); </code></pre>