in reply to Verbose Tk Code

Why not have

my %default = (-background => 'cyan'); sub make_label( $parent, %attrs ) { $parent->Label( %default, %attrs )->pack } make_label(-text => ' ' ); ...

I don't see a need to involve a DSL here when simple subroutines and global(-ish) variables can achieve the same.

Replies are listed 'Best First'.
Re^2: Verbose Tk Code
by LanX (Saint) on Feb 28, 2021 at 18:33 UTC
    probably, but my question was rather at Tk experts if that's even still necessary.

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    Wikisyntax for the Monastery

    PS: zentara where are you? :)

      Hello LanX,

      I'm obviously not an expert, but waiting for zentara to awake from his oak you can have my humble opinion.

      Corion is right: if you have a case where repetition is needed providing some %default is better tan nothing and suffices.

      The real problem is that writing a GUI is verbose. My best Tk program is tartaglia's triangle experiment. The interface is clear for my taste but as you can see there are ~70 lines of pure verbose Tk code. Ok I have a lot of -side => 'left',-expand => 1,-padx=>5 but it adds nothing to me if I have some shortcut for this, not even in the Corion's simple way.

      Why? Because I generally cut and paste my own code.

      Then you can have very sligth differences: nowadays I'm playing with yet another Tk and GD application: look at its init_control_window sub: I'm packing bigger frames with the border and then inside them I put othere smaller frames expanding horizontally, but first and last subframes also need -pady => 5 to look nicer. In the same way if you want something to be packed at -side => 'right' and you want it to not be too much to the border, then the first element (right aligned elements must be packed in reverse order) need a different -padx value. And so on.

      So in my humble opinion Tk is already complicated this way and some shortcut as in your example can make it even less redable.

      L*

      There are no rules, there are no thumbs..
      Reinvent the wheel, then learn The Wheel; may be one day you reinvent one of THE WHEELS.
        Hi Discipulus

        thanks for the code links.

        > if you have a case where repetition is needed providing some %default is better tan nothing and suffices.

        The example in the OP had only one method, the point of with is to handle many different methods on the same object.

        with is available in many languages, tho Tk might be the wrong field for applying it.

        The other default options were optional, but it surprised me a lot that Tk needed it. Must be related to the TCL brige.

        > Why? Because I generally cut and paste my own code.

        Well, personally I prefer DRY over boilerplating, but YMMV.

        I looked into your code, and I see plenty of possibilities to improve readability.

        may I suggest:

        { my $Entry = sub { my ($self,$textvar) = @_; return $self ->Entry(-width => 3,-borderwidth => 4, -textvariable => $t +extvar) ->pack(-side => 'left', -expand => 1,-padx=>5); }; # ... $fr2a->$Entry(\$size_help); }

        instead of many instances of

        $fr2a->Entry(-width => 3,-borderwidth => 4, -textvariable => \$size_he +lp)->pack(-side => 'left', -expand => 1,-padx=>5);

        same for other methods.

        Please note that you can

        • restrict the scope of these anonymous methods to blocks, they are just lexical variables
        • give them self-documenting names
        • make later adjustments at a central point.
        • still add verbose C&P code in the middle

        > Corion is right:

        TIMTOWTDI ... but YMMV :)

        Cheers Rolf
        (addicted to the Perl Programming Language :)
        Wikisyntax for the Monastery

        update

        improved code for method-wrapper.

      I've lately been doing things like this

      $mw->Button(-text => $_->[0], -command => $_->[1], -font => 24, )->pack( -side => 'left', -fill => 'x', -expand => 1) for [Restart => \&restart], ['Previous State' => \&previous], ['Random Move' => \&random], [Help => \&help], [Exit => sub {$mw->destroy}];

      which is a section from my chess player on RosettaCode https://rosettacode.org/wiki/Chess_player#Perl and I probably would do the same kind of thing for those five Labels.

      One might consider for to be a perl approximation of with :)

        Thanks

        > One might consider for to be a perl approximation of with :)

        yep, I was also thinking of offering a $_ default

        with { meth1(); meth2(); ... } for @objects;

        Tho your example didn't alias the objects but the attributes.

        But Tk might not be the best use case here, Choroba privately suggested to look at XML::LibXML .

        Cheers Rolf
        (addicted to the Perl Programming Language :)
        Wikisyntax for the Monastery