tags:

views:

866

answers:

8

I am considering doing some automation of tasks on my Windows desktop (e.g. sorting through large collections of music/text/photo files, etc...).

Seeing how my main area of developer expertise is Perl on Unix, I'd prefer to stick to Perl for coding the business logic of whatever I need done, just for the sake of development efficiency.

The question is, if I want to slap some GUI on top of the work (ala Perl::Tk on Unix), what are my GUI toolkit options and which one would you recommend using?

Please note that I'd like this question to be a good learning opportunity to other SO users, so I would welcome ANY answers even if they don't necessarily satisfy my own limitations/needs listed below, although notes elaborating on how your solution relates to these considerations would be very welcome.

My considerations are mostly driven by the fact that I want a quickly developed tool for personal use to save myself time on tasks I now do manually.

  • Main consideration is Perlishness of development - "Easy things should be easy and hard things should be possible" as a Perl slogan goes. Especially the first part :)

  • Prefer (but not insist) to be as native as possible as far as components used. E.g. rather re-use Windows' file open dialog vs. having some custom Java dialog.

  • I would prefer to use something that would have a small learning curve (e.g. no need to learn intricacies of OLE/COM), since the goal here is speedy development of tools I need to simplify my life as opposed to developer education which I concentrate on areas more relevant to my day job :).

    But I definitely would love to get exposure to something new/cool while doing this, e.g. if some nice Monad based GUI components are suggested I'm definitely curious.

  • Performance matters (e.g. I may need to display a directory listing with >10000 files), but is not of paramount concern - I am a pretty good GUI designer and developer and can always architect my app and design a GUI to scale well if needed).

  • I would strongly prefer (though not insist on) a framework that does not force me to compile stuff. e.g. Perl libraries are more preferable to custom Java stuff I need to compile. But if the framework is perfect in all other respects, I'm open to a compiled solution (as long as it doesn't required me to purchase Visual Studio or somesuch - I want to build a Windows GUI front-end for personal use, not invest in becoming a Windows developer).

I'm pretty open and flexible outside of above constraints. Some ActivePerl/Strawberry Perl libraries, MS PowerShell based components - heck, if nothing better shows up I'll just install Apache on my PC and build a web front-end :)

+3  A: 

While Tk and Qt are also available (more general frameworks originally intended for other languages, on which you can also use Perl), and Tk probably most popular as it's been around longest, Win32::GUI would seem to meet your requirements best. If you like WISIWYG GUI designers, you could use Loft on top of Win32::GUI, but you don't have to if you'd rather do everything programmatically.

Alex Martelli
+2  A: 

I'd just stick with Tk myself. It runs on Windows and you already know it.

David Dorward
+6  A: 

With respect to "perlishness" of the interface, I'd suggest plain old Tk. Unfortunately, it looks quite antiquated and non-win32-ish.

If you want native widgets, I think your best shots are using the native Windows GUI via Win32::GUI or Wx. I have no experience with Win32::GUI, but Wx is quite nice. It does, however, have a rather steep learning curve and the interface isn't very "perlish". The C++ roots show a little bit (for better or worse).

There are a few Tk-replacements that are actually thin wrappers around Tcl/Tk (I think Tcl::Tk and Tkx). They look more modern than Perl/Tk, but I have no hands-on experience with these either. If you're developing for Windows only, have a look at ActivePerl which comes with (I think) Tkx. Their ppm4 package manager is written using it and looks pretty nice!

tsee
+5  A: 

There are a number of options listed in perlfaq3 and some additional ones that aren't. I'm only familiar with the Tk-based ones.

Perl/Tk has the most "perlish" interface but it hasn't been updated to take advantage of tile (native/themed widget) support in the current version of Tk (and probably never will be). Tkx uses a different bridge to Tk. It allows access to everything in Tk (and it's faster, too) but the syntax is less perlish. Tkx is designed to be a thin wrapper over Tk; you have to consult the Tk documentation for most things and translate for using it from Perl. The Tcl/Tk module uses the same bridge as Tkx but supports a syntax that's mostly the same as Perl/Tk.

Whether or not you need to compile anything depends on which version of Perl you use. If you use Strawberry Perl you'll probably have to compile something no matter what toolkit you choose. ActivePerl distributions have included Tkx since sometime in the 5.8.x cycle and stopped bundling Tk as of 5.10, although it's still available via PPM. Tcl/Tk is available from CPAN but I haven't been able to get it to work with the Tk library that comes bundled with ActivePerl; you may need to install Tcl separately to use it.

Personally, I used to use Perl/Tk but now use Tkx.

Michael Carman
Michael - to be clear, I don't care much about Perlishnes of syntax (at one point or another in my life, I programmed, BASIC, Pascal, LOGO, Prolog, Lisp, Scheme, C, ADA, Perl, Lotus Notes, SQL and PowerBuilder. I can handle any syntax :) I only care about not having to jump through 15 hoops expressed in 30 lines of code to do what perl would do in 15 characters.
DVK
Oh, and thanks for compatibility/inclusiveness info... my other task is picking between AS and Strawberry and this info helps.
DVK
+2  A: 

I would choose GTK because because it has a study guide (at the moment I'm using Wx and there's plenty of available source code in Perl using Wx but no actual official documentation .. apart from some articles, so no book ... no official stuff) , if not Qt is an option also , and it has some proper documentation(but I haven't tried it).

Tk has very big problems and I won't use it.

As for your performance problems ... I'm pretty sure no decent application would be concerned if it's displaying 100000 or 10^100 files , since very few fit on your screen, so you can do some clipping ).

xxxxxxx
It's true that WxPerl doesn't have a copy of the wxWidgets documentation translated to Perl. But the official wxWidgets documentation applies to WxPerl 90% of the cases. In those 10% where it doesn't, it has a note about how WxPerl (or similarly WxPython) differ from the C++ API. It's true though, that it helps to know basic C++ syntax when reading the reference.
tsee
+1  A: 

If it is just to get a simple GUI on top of your scripts then the easiest path is VB.NET (or C#). That is what I do.

With Visual Studio's designer it is just a matter of designing the form, double click on the button that will that start processing, add code to read off parameters from the GUI elements (e.g. file paths in TextBox'es) and pass the information to the script through environment variables or command line parameters.

Example from one of my applications (used by real users):

Dim inputFolder As String = txtInputDataMGFfolder.Text
Dim outputFile As String = txtOutputMGFfile.Text

Dim ws As WshShellClass = New WshShellClass

Dim objEnviron2 As IWshRuntimeLibrary.IWshEnvironment = _
 ws.Environment("PROCESS")

objEnviron2.Item("INDIR") = inputFolder
objEnviron2.Item("OUTFILE") = outputFile

'It may or may not help for this: the user dialogs for selecting 
'files may change the current directory and running the Perl
'script or one of the .pm files would fail.
ws.CurrentDirectory = appPath()

ws.Run("%COMSPEC% /K   perl -w MultRawPrepare.pl", 1, False)

Note that use of Windows Script Host for this may not be strictly neccessary, but if it is then this is needed:

'Requires adding reference to project:
'  menu Project/Add Reference/COM/Windows Script Host Object Model
'    Note: "Windows", not "Microsoft".
'
'Note: the DLL may not be registered;
'  D:
'  cd \WINNT\system32
'  regsvr32 wshom.ocx
Imports IWshRuntimeLibrary 'For WshShellClass.

appPath() is defined as follows (and required "Imports System.Reflection" in the beginning of the VB.NET file):

Public Shared Function appPath() As String

    '"[Assembly]" requires System.Reflection
    Dim strAppDir As String = _
      Path.GetDirectoryName( _
        [Assembly].GetExecutingAssembly().GetModules(False)(0).FullyQualifiedName)
    Return strAppDir
End Function 'appPath

User selection of files or folders is easy to add, but is helped by HOW-TO instructions and a little bit of boilerplate code.

The Express edition of Visual Studio for VB.NET is free.

Peter Mortensen
It's nice to know you use VB.NET/C# , but please notice the word "Perl" in the title.Thank you
xxxxxxx
@spx2: I only posted my answer because the OP relaxed the requirements: "Please note that I'd like this question to be a good learning opportunity to other SO users, so I would welcome ANY answers even if they don't necessarily satisfy my own limitations/needs listed below".
Peter Mortensen
+2  A: 

Shameless plug - I am in the process of writing a pure Perl GUI toolkit XUL::Gui that renders its GUI using Firefox. It allows you do anything Firefox can (XUL, HTML, javascript, flash, other web tech). Firefox uses the native look and feel of the OS (or any other theme you want), and is available for most platforms.

use XUL::Gui;

display Window title=>'My Application',
    Button( label=>'click me', oncommand=>sub{ shift->label = 'ouch'} );

Its currently under development, but probably stable enough to start working with. The idea is to be as simple and perlish as possible. Nearly all boilerplate is optional, with sensible defaults. For example, the Window tag is only needed because I wanted to title the window.

The module is up on CPAN. I'd encourage anyone to take a look, and send me feature requests or bug reports.

Eric Strom
It works! On Windows, no less. I am going to have to look into this.
Sinan Ünür
Looks very curious - I'll look as well!
DVK
A: 
Chanio