Tk::Tcl-perl (3)
Leading comments
Automatically generated by Pod::Man 4.09 (Pod::Simple 3.35) Standard preamble: ========================================================================
NAME
Tcl_vs_perl - very old suspect documentation on porting.DESCRIPTION
This isn't really a .pod yet, nor is it Tcl vs perl it is a copy of John's comparison of Malcolm's original perl/Tk port with the current one. It is also out-of-date in places.
From: john@WPI.EDU (John Stoffel ) Here are some thoughts on the new Tk extension and how I think the organization of the commands looks. Mostly, I'm happy with it, it makes some things more organized and more consistent with tcl/tk, but since the overlying language is so different, I don't think we need to follow exactly the tcl/tk model for how to call the language. The basic structure of the Tk program is: require Tk; $top = MainWindow->new(); # # create widgets # Tk::MainLoop; sub method1 { } sub methodN { } This is pretty much the same as tkperl5a5, with some cosmetic naming changes, and some more useful command name and usage changes. A quick comparison in no particular order follows: tkperl5a5 Tk ------------------------------- ----------------------------------- $top=tkinit(name,display,sync); $top=MainWindow->new(); tkpack $w, ... ; $w->pack(...) $w = Class::new($top, ...); $w = $top->Class(...); tkmainloop; Tk::MainLoop; tkbind($w,"<key>",sub); $w->bind("<key>",sub); tkdelete($w, ...); $w->delete(...); $w->scanmark(...); $w->scan("mark", ...); $w->scandragto(...); $w->scan("dragto", ...); $w->tkselect(); $w->Select(); $w->selectadjust(...); $w->selection("adjust", ...); $w->selectto(...); $w->selection("to", ...); $w->selectfrom(...); $w->selection("from", ...); $w->tkindex(...); $w->index(...); tclcmd("xxx",...); &Tk::xxx(...) # all Tk commands, but no Tcl at all tclcmd("winfo", xxx, $w, ...); $w->xxx(...); $w->mark(...); $w->tag(...); $w->grabstatus(); $w->grab("status"); $w->grabrelease(...); $w->grab("release", ...); focus($w); $w->focus; update(); Tk->update(); idletasks(); Tk->update("idletasks"); wm("cmd",$w, ...); $w->cmd(...); destroy($w); $w->destroy(); Tk::option(...); $w->OptionGet(name,Class) $w->place(...) Tk::property(...); $w = Entry::new($parent,...) is now $w = $parent->Entry(...) As this allows new to be inherited from a Window class. -method=>x,-slave=>y is now -command => [x,y] 1st element of list is treated as "method" if y is an object reference. (You can have -command => [a,b,c,d,e] too; b..e get passed as args). Object references are now hashes rather than scalars and there is only ever one such per window. The Tcl_CmdInfo and PathName are entries in the hash. (This allows derived classes to re-bless the hash and keep their on stuff in it too.) Tk's "Tcl_Interp" is in fact a ref to "." window. You can find all the Tk windows descended from it as their object references get added (by PathName) into this hash. $w->MainWindow returns this hash from any window. I think that it should extend to multiple tkinits / Tk->news with different Display's - if Tk code does. Finally "bind" passes window as "extra" (or only) argument. Thus Tk::Button->bind(<Any-Enter>,"Enter"); Binds Enter events to Tk::Button::Enter by default but gets called as $w->Enter so derived class of Button can just define its own Enter method. &EvWref and associated globals and race conditions are no longer needed. One thing to beware of : commands bound to events with $widget->bind follow same pattern, but get passed extra args : $widget->bind(<Any-1>,[sub {print shift}, $one, $two ]); When sub gets called it has : $widget $one $two passed. 1st extra arg is reference to the per-widget hash that serves as the perl object for the widget. Every time an XEvent a reference to a special class is placed in the widget hash. It can be retrieved by $w->XEvent method. The methods of the XEvent class are the Tcl/Tk % special characters. Thus: $widget->bind(<Any-KeyPress>, sub { my $w = shift; my $e = $w->XEvent; print $w->PathName," ",$e->A," pressed ,$e->xy,"\n"); }); XEvent->xy is a special case which returns "@" . $e->x . "," . $e->y which is common in Text package. Because of passing a blessed widget hash to "bound" subs they can be bound to (possibly inherited) methods of the widget's class: Class->bind(<Any-Down>,Down); sub Class::Down { my $w = shift; # handle down arrow } Also: -command and friends can take a list the 1st element can be a ref to as sub or a method name. Remaining elements are passed as args to the sub at "invoke" time. Thus : $b= $w->Button(blah blah, '-command' => [sub{print shift} , $fred ]); Should do the trick, provided $fred is defined at time of button creation. Thus 1st element of list is equivalent to Malcolm's -method and second would be his -slave. Any further elements are a bonus and avoid having to pass ref to an array/hash as a slave.