1Tcl-perl(3) User Contributed Perl Documentation Tcl-perl(3)
2
3
4
6 Tcl vs perl - very old suspect documentation on porting.
7
9 This isn't really a .pod yet, nor is it Tcl vs perl it is a copy of
10 John's comparison of Malcolm's original perl/Tk port with the current
11 one. It is also out-of-date in places.
12
13 From: john@WPI.EDU (John Stoffel )
14
15 Here are some thoughts on the new Tk extension and how I think the
16 organization of the commands looks. Mostly, I'm happy with it, it
17 makes some things more organized and more consistent with tcl/tk, but
18 since the overlying language is so different, I don't think we need to
19 follow exactly the tcl/tk model for how to call the language.
20
21 The basic structure of the Tk program is:
22
23 require Tk;
24
25 $top = MainWindow->new();
26
27 #
28 # create widgets
29 #
30
31 Tk::MainLoop;
32
33 sub method1 {
34 }
35
36 sub methodN {
37 }
38
39 This is pretty much the same as tkperl5a5, with some cosmetic naming
40 changes, and some more useful command name and usage changes. A quick
41 comparison in no particular order follows:
42
43 tkperl5a5 Tk
44 ------------------------------- -----------------------------------
45 $top=tkinit(name,display,sync); $top=MainWindow->new();
46
47 tkpack $w, ... ; $w->pack(...)
48
49 $w = Class::new($top, ...); $w = $top->Class(...);
50
51 tkmainloop; Tk::MainLoop;
52
53 tkbind($w,"<key>",sub); $w->bind("<key>",sub);
54
55 tkdelete($w, ...); $w->delete(...);
56
57 $w->scanmark(...); $w->scan("mark", ...);
58
59 $w->scandragto(...); $w->scan("dragto", ...);
60
61 $w->tkselect(); $w->Select();
62
63 $w->selectadjust(...); $w->selection("adjust", ...);
64
65 $w->selectto(...); $w->selection("to", ...);
66
67 $w->selectfrom(...); $w->selection("from", ...);
68
69 $w->tkindex(...); $w->index(...);
70
71 tclcmd("xxx",...); &Tk::xxx(...) # all Tk commands, but no Tcl at all
72
73 tclcmd("winfo", xxx, $w, ...); $w->xxx(...);
74
75 $w->mark(...);
76
77 $w->tag(...);
78
79 $w->grabstatus(); $w->grab("status");
80
81 $w->grabrelease(...); $w->grab("release", ...);
82
83 focus($w); $w->focus;
84
85 update(); Tk->update();
86
87 idletasks(); Tk->update("idletasks");
88
89 wm("cmd",$w, ...); $w->cmd(...);
90
91 destroy($w); $w->destroy();
92
93 Tk::option(...);
94 $w->OptionGet(name,Class)
95
96 $w->place(...)
97
98 Tk::property(...);
99
100 $w = Entry::new($parent,...)
101
102 is now
103
104 $w = $parent->Entry(...)
105
106 As this allows new to be inherited from a Window class.
107
108 -method=>x,-slave=>y
109
110 is now
111
112 -command => [x,y]
113
114 1st element of list is treated as "method" if y is an object reference.
115 (You can have -command => [a,b,c,d,e] too; b..e get passed as args).
116
117 Object references are now hashes rather than scalars and there
118 is only ever one such per window. The Tcl_CmdInfo and PathName
119 are entries in the hash.
120
121 (This allows derived classes to
122 re-bless the hash and keep their on stuff in it too.)
123
124 Tk's "Tcl_Interp" is in fact a ref to "." window.
125 You can find all the Tk windows descended from it as their object
126 references get added (by PathName) into this hash.
127 $w->MainWindow returns this hash from any window.
128
129 I think that it should extend to multiple tkinits / Tk->news
130 with different Display's - if Tk code does.
131
132 Finally "bind" passes window as "extra" (or only)
133 argument. Thus
134
135 Tk::Button->bind(<Any-Enter>,"Enter");
136
137 Binds Enter events to Tk::Button::Enter by default
138 but gets called as $w->Enter so derived class of Button can just
139 define its own Enter method. &EvWref and associated globals and race
140 conditions are no longer needed.
141
142 One thing to beware of : commands bound to events with $widget->bind
143 follow same pattern, but get passed extra args :
144
145 $widget->bind(<Any-1>,[sub {print shift}, $one, $two ]);
146
147 When sub gets called it has :
148
149 $widget $one $two
150
151 passed.
152
153 1st extra arg is reference to the per-widget hash that serves as the
154 perl object for the widget.
155
156 Every time an XEvent a reference to a special class is placed
157 in the widget hash. It can be retrieved by $w->XEvent method.
158
159 The methods of the XEvent class are the
160 Tcl/Tk % special characters.
161
162 Thus:
163
164 $widget->bind(<Any-KeyPress>,
165 sub {
166 my $w = shift;
167 my $e = $w->XEvent;
168 print $w->PathName," ",$e->A," pressed ,$e->xy,"\n");
169 });
170
171 XEvent->xy is a special case which returns "@" . $e->x . "," . $e->y
172 which is common in Text package.
173
174 Because of passing a blessed widget hash to "bound" subs they can be
175 bound to (possibly inherited) methods of the widget's class:
176
177 Class->bind(<Any-Down>,Down);
178
179 sub Class::Down
180 {
181 my $w = shift;
182 # handle down arrow
183 }
184
185 Also:
186
187 -command and friends can take a list the 1st element can be a ref to
188 as sub or a method name. Remaining elements are passed as args to the
189 sub at "invoke" time. Thus :
190
191 $b= $w->Button(blah blah, '-command' => [sub{print shift} , $fred ]);
192
193 Should do the trick, provided $fred is defined at time of button creation.
194
195 Thus 1st element of list is equivalent to Malcolm's -method and second
196 would be his -slave. Any further elements are a bonus and avoid
197 having to pass ref to an array/hash as a slave.
198
199
200
201perl v5.34.0 2022-01-21 Tcl-perl(3)