http://www.perlmonks.org?node_id=992851


in reply to Perl Gtk3 Tutorial

I have previous Gtk2.pm experience, and skimmed through your tutorial. It actually looks exactly like Gtk2 except perhaps for a few new widgets.

The code examples have perhaps a bit too much boilerplate; I'd remove use diagnostics and use feature ':5.14' when not needed (you appear to be using only say anyway so use 5.010; should work as well.) Maybe even remove the ~6 lines you use for window creation from the later examples in the document (of course, they should stay intact in the .pl files).

I'd perhaps visualise how packing with containers works a bit more thoroughly early on. (Such as drawing the containers' outlines and variable names over the UI.) It's one of the most important points to understand about Gtk. (I notice you've got a pack-style visualisation later on in the document; that one's at a good spot.)

I have a little bit of an issue with how you use the same callback to do three different things depending on $userdata in examples 5 and 6a, but I'll let that slide since it's not a bad way to demonstrate the use of that variable.

You are missing one important example about $userdata: How to pass multiple values. (either pass an arrayref or use a closure/anon sub to wrap around it)

The progress bar example seems to be missing how to stop it. (returning FALSE from the idle callback, or deleting the callback) (not to mention that proper utilisation of a progress bar is quite a bit more difficult. perhaps a note somewhere that your callbacks shouldn't take much time or the UI will freeze?)

There's one more thing I'd like to see, but it may not be for the level of Perl user you aim your tutorial for. You keep all the UI variables as global. Let's take example 6d. Instead of sub update accessing the global variable $label to do its thing. It would be nicer if you passed $label as an argument to your function. This allows you to compartmentalise your UI code and let variables you don't use fall out of scope. (I generally set up the whole UI in a single sub.)