Summary: comp.lang.perl.tk Frequently Asked Questions. Archive-name: perl-faq/ptk-faq Posting-Frequency: monthly Last-modified: Date: Sat May 31 16:48:37 1997 URL: http://w4.lns.cornell.edu/~pvhp/ptk/ptkFAQ.html Version: 1.00_07 URL (Hypertext-split): http://w4.lns.cornell.edu/~pvhp/ptk/ptkTOC.html URL (Plaintext): http://w4.lns.cornell.edu/~pvhp/ptk/ptkFAQ.txt Image-supplement: http://w4.lns.cornell.edu/~pvhp/ptk/ptkIMG.html ftp-Archive: ftp://ftp.ccd.bnl.gov/pub/ptk/ptkFAQ.txt ftp-Archive: ftp://rtfm.mit.edu/pub/usenet/perl-faq/ptk-faq/ e-mail-Archive: ptkfaq@pubweb.bnl.gov Perl/Tk FAQ *********** The Perl/Tk extension to the Perl programming language is copyrighted by its author Nick Ing-Simmons whose Tk400.202/COPYING file reads as follows: Copyright (c) 1995-1996 Nick Ing-Simmons. All rights reserved. This package is free software; you can redistribute it and/or modify it under the same terms as Perl itself, with the exception of the files in the pTk sub-directory which have separate terms derived from those of the orignal Tk4.0 sources and/or Tix. IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. See pTk/license.terms for details of this Tk license, and pTk/Tix.license for the Tix license. This compilation of Frequently Asked Questions & answers (FAQ) is intended to answer several of the first (and largely more basic) questions posted to the comp.lang.perl.tk newsgroup and the ptk mailing list. This document concerns itself with the Perl/Tk programming language (or, if you prefer, the Tk extension to Perl). Please be aware that this is not the Perl FAQ, this is not the Tcl FAQ, nor is this the Tcl/Tk FAQ. Each of those other documents is a useful source of information for Perl/Tk programmers but they are completely different from this one. This is a dynamic document and contributions, clarifications, and corrections are most welcome! Please send e-mail to or to . With your help this document will get better (-: perl/Tk FAQ 1. What is perl/Tk? 2. What is the difference between perl/Tk and Tkperl? 3. Do I need Tcl/Tk in order to build Perl/Tk? 4. Where is it? 5. What/Where is CPAN? 6. How do I build it? 7. Where is the Documentation? 8. How do I write scripts in perl/Tk? 9. What widget types are available under perl/Tk? 10. How do I get widget X to do Y ? 1. How do I get a Button to call a Perl subroutine? 2. How do I get a Button to actively change under my mouse pointer? 3. How do I arrange the layout of my widgets? 4. How do I get a Popup to popup? 5. How do I bind keyboard keys? 6. How do I add bindings? 7. How do I bind the action of a slider (sic) to ... ? 8. How do I configure a Scrollbar to scroll multiple widgets? 9. How do I display a bitmap? 10. How do I display an image? 11. What Image types are available? 12. Is there any way to have more than one Listbox contain a selection? 13. How do I select a range of tags in a Text widget? 14. How do I group Radiobuttons together? 15. How do I specify fonts? 16. How do I get the entry in an Entry? 17. How do I hide a password Entry? 18. How do I limit an Entry's insertion width? 19. How do I obtain Menus that do not tear off? 11. How do I get a Canvas to ... ? 1. Display a bitmap? 2. Erase a display? 3. Display an Image? 4. What things can be created on a Canvas? 5. How do I redraw a line on a Canvas? 6. How do I use the Canvas as a geometry manager? 7. How do I get a Canvas to output PostScript(c)? 8. How do I get a PostScript(c) output of a Canvas w/ widgets? 9. How do I get the size of a Canvas? After a re-size? 10. How do I bind different actions to different areas of the same Canvas? 12. Common Problems. 1. What do the ->, => and :: symbols mean? 2. What happened to the ampersands &? 3. What happened to the quotation marks? 4. Must I use "my" on all my variables? 5. Is there a way to find out what is in my perl/Tk "PATH"? 6. What is the difference between use and require? 7. How do I change the cursor/color? 8. How do I ring the bell? 9. How do I determine the version of perl/Tk that I am running? 10. How do I call perl from C? 11. How do I call Tcl code from perl/Tk? 13. What are some of the primary differences between Tcl/Tk and Perl/Tk? 14. How do I install new scripts | modules | extensions? 15. How do I write new modules? 16. Composite Widgets. 1. How do I get a Dialog box? 2. Is there a file selector? 3. Is there a color editor? 4. Is there a round Scale? 5. Is there something equivalent to tkerror? 6. Are there Tables? 17. Programming/development tools. 1. Is there a Tcl/Tk to perl/Tk translator? 2. Is there something equivalent to wish in perl/Tk? 3. Is there a debugger specifically for perl/Tk? 4. Is there a GUI builder in perl/Tk? 18. Processes & Inter-Process Communication under Perl/Tk. 1. How does one get Perl/Tk to act on events that are not coming from X? 2. Is there a send and do I need xauth? 3. How can I do animations using after? 4. How do I update widgets while waiting for other processes to complete? 5. How do you fork on System V (HP)? 19. How do I "clear the screen"? 20. Is there a way to have an X application draw inside a perl/Tk window? 21. Is there a version for Microsoft Windows(tm)? 22. Are there any international font packages for perl/Tk? 23. Are there any other ways to create event based interfaces from perl? 24. Where can I get more information on graphics (modules|scripts)? 25. Are there any major applications written in perl/Tk? 26. What is the history of pTk and perl/Tk? 27. What can we expect the future to hold? 28. How do I obtain the latest version of this FAQ? 29. Acknowledgements & maintainer. ______________________________________________________________________ 1. What is perl/Tk? Perl/Tk (also known as pTk or ptk) is a collection of modules and code that attempts to wed the easily configured Tk 4 widget toolkit to the powerful lexigraphic, dynamic memory, I/O, and object-oriented capabilities of Perl 5. In other words, it is an interpreted scripting language for making widgets and programs with Graphical User Interfaces (GUI). (Examples of widget programs [not necessarily written in perl/Tk] include xterm, xclock, most web-browsers, etc.. They are programs with "GUI" interfaces of one sort or another and are subject to the effects of your window manager.) The current release of Perl/Tk is based on "Tk 4.0p3" the widget Toolkit originally associated with the Tcl (Tool command language) scripting language. However, Perl/Tk does not require any of the lexical features/idiosynchrocies of Tcl. Perl/Tk uses perl 5 syntax, grammar, and data structures. The ``Tk400.202'' package is the production release of perl/Tk (corresponding to Tcl/Tk-4.0p3) and was written primarily by Nick Ing-Simmons at Texas Instruments in Northampton, England, to work with the latest version of Larry Wall's ``perl''. Nick Ing-Simmons is currently busy converting the Tcl/Tk-4.1 code to perl callable code as well. An initial alpha release of the effort is available from CPAN as ``Tk402.000''. The pTk code proper is an externally callable Tk toolkit (i.e. a re-write of the Tk 4.0 code that allows easier external linking & calling, especially by perl). Ptk can then be called from Perl 5 via the Tk.pm et al perl glue modules. Hence "ptk" does not necessarily refer to Perl Tk but could be taken to mean portable Tk - given a glue package to another language. The stated goal of the pTk code is to have its library usable from perl, Tcl, LISP, C++, python, etc.. It just so happens that present work is concentrating on perl. Historical note: "ptk" was known as "ntk" before about 11:30 EST 4 May 1995. The perl/Tk language is itself further extensible via the standard perl 5 module mechanism. A number of composite widget and special character extensions to the language have been written using perl modules. ______________________________________________________________________ 2. What is the difference between perl/Tk and Tkperl? TkPerl was originally the name of a (now unsupported) perl 4 package that Malcolm Beattie at Oxford University gave to his code to wed the Tk X toolkit with Perl. (He has since referred to that package as a different "kettle of fish" from perl/Tk.) Since that beginning Malcolm has also come up with a Tcl module for perl 5 that has a Tcl::Tk module extension. That module allows the use of Tcl within a Perl script (i.e. you must know both languages to get your widgets to work.) If you are interested in that package instead, see the necessary kits for Malcolm Beattie's Tcl/Tk extensions to Perl, which have been distrubuted as Tcl-b#.tar.gz and TclTk-b#.tar.gz files in the authors/id/MICB/ directory at CPAN sites (locations given in a separate question in this FAQ). The name "tkperl" is sometimes applied to the "perl/Tk" or "ptk" package that is the subject of this FAQ. Nick Ing-Simmons prefers "perl/Tk" as the name of the package, with "pTk" or "ptk" as contractions of that name as well as referring to something technically distinct: given the extensibility of the pTk code the "p" could also be taken to mean 'portable' or 'pure' (not to be confused with either the Helsinki University of Technology portTk, nor with Brian Warkentine's Rivet). In this document the code of interest is either referred to as "perl/Tk", "pTk", or "ptk" though the primary focus is on perl/Tk. Warning: do not attempt to install both perl/Tk and Tcl/Tkperl in the same perl installation. The names in the respective modules overlap. In particular the Tcl::Tk module is declared in a Tk.pm file - so a statement like: use Tk; will probably confuse your perl. If you cannot live without either module then install make & maintain separate perls for each and arrange your script writing accordingly (this will not be easy). A more extensive comparison of the differences between the Tkperl and the perl/Tk code is given in the Tcl-perl.pod file that is distributed with perl/Tk (see the following questions for locations). Lastly, it should be mentioned that if you build your perl/Tk statically rather than dynamically it will make a new perl interpreter called tkperl (confusing isn't it? :-). ______________________________________________________________________ 3. Do I need Tcl/Tk in order to build Perl/Tk? Short answer: No not at all. Perl/Tk is completely independent of Tcl/Tk. Longer answer: In order to build Perl/Tk from source code you do need a recent version of perl, the perl/Tk source code kit, a graphical user interface library such as Xlib, a C or C++ compiler, and a make utility. In some rare cases Perl/Tk binaries are distributed for some platforms but that is more the exception than a general rule (see below). If you will be attempting to port Perl/Tk to your platfrom then you might want to consult the document at: http://w4.lns.cornell.edu/~pvhp/ptk/ptkPORT.html where each of these necessities is discussed in a bit more detail. ______________________________________________________________________ 4. Where is it? Source code ----------- Tk400.202 & Tk402.00 the latest production and alpha releases are available from the modules/by-authors/Nick_Ing-Simmons/"> directory on the CPAN. You will need a made and installed perl (Perl 5.004 being an excellent choice), a recent MakeMaker and the Tk4* kit. To obtain all of these (as well as several other modules that sophisticated Tk programs now rely on) visit a CPAN ftp site. CPAN (the Comprehensive Perl Archive Network) and what you need to get from it, is discussed in more detail in the next question. (The rest of this question remains for historical reasons, as well as to point out some non CPAN resources.) Tk-b8: The Tk-b8 kit remains on CPAN since it was compatible with the widely distributed and installed Perl (5.001m) Binaries -------- A pre-compiled binary distribution of Perl5.001m with Tk-b8 for Linux is available from: Australia (please be patient and only try during off hours) ftp://syd.dit.csiro.au/pub/perl5/local/perl5.001m+Tk-b8-Linux-ELF.tar.gz It unpacks into /usr/local. You need to have ELF running and to have the ELF X11 libraries (please be patient and only try during off hours). Binaries for the old Perl 5 & Tk-b6 are available for a number of UNIX platforms courtesy of Thomas Schlagel and Alan Stange of Brookhaven Lab at: USA http://pubweb.bnl.gov/~ptk/ Thomas and Alan have recently (winter 1995-1996) announced that they will update the Tk module version number of the many binaries they distribute. Physical media (mostly source code) ----------------------------------- With traffic jams on today's information superhighway more and more common it is often convenient to be able to snail mail a CD rather than suffer with .tar.gz files that are corrupted by network spottiness. Here is a very brief list of some folks who distribute perl (and hopefully Tk too!) on physical media. This list is not intended to be complete, nor an endorsement of any vendor (I personally do not have the time to check out any of these but have seen that some tend to be out of date by a few months with respect to CPAN so please be careful). See the hypertext version of this document for hyperlinks to the following vendors: Walnut Creek Perl CD This CD specifies a release date. $39.95 Cosmos Engineering Company Offers Linux plus perl for sale on a 1 Gigabyte IDE hard drive for PC-like computers. $279.00 (Fall 1996) Unix Review System Administration A CD that contains "Perl 5.0" (and much other stuff including Tcl/Tk and Expect) for $49.95. Telephone: (800) 444-4881. InfoMagic Mother of Perl This 2 CD set contains perl 5.001 and sells for $35.00 Ready to Run Perl (unknown version) available for sale for many types of Unix and other operating systems. ______________________________________________________________________ 5. What/Where is CPAN? "CPAN" = Comprehensive Perl Archive Network a worldwide collection of anonymous ftp sites for Perl et al (not to be confused with CTAN which is for TeX, nor CSPAN which rarely deals with computer software). The files of particular interest to a perl/Tk programmer would include: o The latest Tk release should be in the modules/by-authors/Nick_Ing-Simmons/ directory at any CPAN ftp site (listed below). o The latest official Perl release should be in the src/ directory in a file called latest.tar.gz at any CPAN ftp site (listed below). o If you need something older or newer than the "latest supported release" try the src/5.0/ directory at any CPAN ftp site (listed below). There are a number of modules available for use with Tk. Among them: o Alan Scheinine's SelFile.pm is in the modules/by-authors/Alan_Scheinine/ directory at any CPAN ftp site (listed below). o Guy Decoux's BLT_Table geometry manager is in the modules/by-authors/id/GUYDX/ directory at any CPAN ftp site (listed below). o Ilya Zakharevich's eText plug in replacement for the Text widget is in the modules/by-authors/id/ILYAZ/etext/ directory at any CPAN ftp site (listed below). o Brent B. Powers' Tk-FileDialog and Tk-WaitBox are available from the modules/by-authors/id/BPOWERS/ directory at any CPAN ftp site (listed below). Some of the fancier perl/Tk scripts (news readers and web browsers e.g.) make use of other perl modules/module-bundles. Among those that you ought to consider installing are: o To run the ptknews script you will need Mail/Internet.pm from the Mailtools module kit, available from the modules/by-authors/id/GBARR/ directory at any CPAN ftp/http site (listed below). While there pick up the latest libnet-* module bundle too. o The build of recent versions of perl/Tk requests that you have the URI::URL and HTML::Parse modules already installed. These modules are part of the libwww-perl-*.tar.gz kit, available from the modules/by-authors/id/GAAS/ at any CPAN ftp/http site (listed below). Documentation is available from CPAN: o Assorted documentation for perl is in the doc/ directory at any CPAN ftp site (listed below). o Fairly up-to-date versions of some Perl/Tk external documentation (such as this FAQ) is in the modules/by-authors/id/PVHP/ directory at any CPAN ftp/http site (listed below). (for Perl/Tk official documentation check the Tk/doc/*.htm files that are built with Nick's Tk kit on your computer.) Bringing it all together one can look at: o Most things perl/Tk (with certain exceptions) are also linked to a modules/by-module/Tk/ directory at any CPAN ftp/http site (listed below). o The long version of Tim Bunce and Andreas Koenig's module list helps you sort out things like "which kit is HTML::Parse a part of?". It is in modules/00modlist.long.html and is also posted periodically to newsgroups. Here are the 52 CPAN sites/directories (with dotted quads [IP numbers] given on the right for those without name-servers): Updated: Sun Dec 8 17:12:55 EST 1996 Africa South Africa ftp://ftp.is.co.za/programming/perl/CPAN/ 196.4.160.12 Asia Hong Kong ftp://ftp.hkstar.com/pub/CPAN/ 202.82.7.4 Japan ftp://ftp.jaist.ac.jp/pub/lang/perl/CPAN/ 150.65.7.5 ftp://ftp.lab.kdd.co.jp/lang/perl/CPAN/ 192.26.91.6 South Korea ftp://ftp.nuri.net/pub/CPAN/ 203.255.112.6 Taiwan ftp://dongpo.math.ncu.edu.tw/perl/CPAN/ 140.115.25.3 Australasia Australia ftp://coombs.anu.edu.au/pub/perl/CPAN/ 150.203.76.2 ftp://ftp.mame.mu.oz.au/pub/perl/CPAN/ 128.250.209.2 New Zealand ftp://ftp.tekotago.ac.nz/pub/perl/CPAN/ 202.49.6.24 Europe Austria ftp://ftp.tuwien.ac.at/pub/languages/perl/CPAN/ 128.130.34.160 Belgium ftp://ftp.kulnet.kuleuven.ac.be/pub/mirror/CPAN/ 134.58.127.2 Czech Republic ftp://sunsite.mff.cuni.cz/Languages/Perl/CPAN/ 194.50.23.220 Denmark ftp://sunsite.auc.dk/pub/languages/perl/CPAN/ 130.225.51.30 Finland ftp://ftp.funet.fi/pub/languages/perl/CPAN/ 128.214.248.6 France ftp://ftp.pasteur.fr/pub/computing/unix/perl/CPAN/ 157.99.64.12 Germany ftp://ftp.leo.org/pub/comp/programming/languages/perl/CPAN/ 131.159.0.252 ftp://ftp.rz.ruhr-uni-bochum.de/pub/CPAN/ 134.147.32.42 ftp://ftp.uni-hamburg.de/pub/soft/lang/perl/CPAN/ 134.100.32.54 Greece ftp://ftp.ntua.gr/pub/lang/perl/ Hungary ftp://ftp.kfki.hu/pub/packages/perl/CPAN/ 148.6.0.5 Italy ftp://cis.utovrm.it/CPAN/ 160.80.22.17 the Netherlands ftp://ftp.cs.ruu.nl/pub/PERL/CPAN/ 131.211.80.17 ftp://ftp.EU.net/packages/cpan/ 134.222.91.7 Norway ftp://ftp.uit.no/pub/languages/perl/cpan/ 129.242.4.34 Poland ftp://ftp.pk.edu.pl/pub/lang/perl/CPAN/ 149.156.132.152 ftp://sunsite.icm.edu.pl/pub/CPAN/ 148.81.209.3 Portugal ftp://ftp.ci.uminho.pt/pub/lang/perl/ 193.136.16.247 ftp://ftp.telepac.pt/pub/CPAN/ 194.65.5.98 Russia ftp://ftp.sai.msu.su/pub/lang/perl/CPAN/ 158.250.29.1 Slovenia ftp://ftp.arnes.si/software/perl/CPAN/ 193.2.1.72 Spain ftp://ftp.etse.urv.es/pub/mirror/perl/ 193.144.20.6 ftp://ftp.rediris.es/mirror/CPAN/ 130.206.1.2 Sweden ftp://ftp.sunet.se/pub/lang/perl/CPAN/ 130.238.253.4 Switzerland ftp://sunsite.cnlab-switch.ch/mirror/CPAN/ 193.5.24.1 UK ftp://ftp.demon.co.uk/pub/mirrors/perl/CPAN/ 158.152.1.44 ftp://sunsite.doc.ic.ac.uk/packages/CPAN/ 193.63.255.1 ftp://unix.hensa.ac.uk/mirrors/perl-CPAN/ 129.12.200.129 North America Ontario ftp://ftp.utilis.com/public/CPAN/ 207.34.209.49 ftp://enterprise.ic.gc.ca/pub/perl/CPAN/ 192.197.182.100 California ftp://ftp.digital.com/pub/plan/perl/CPAN/ 204.123.2.4 ftp://ftp.cdrom.com/pub/perl/CPAN/ 165.113.58.253 Colorado ftp://ftp.cs.colorado.edu/pub/perl/CPAN/ 128.138.243.20 Florida ftp://ftp.cis.ufl.edu/pub/perl/CPAN/ 128.227.205.206 Illinois ftp://uiarchive.cso.uiuc.edu/pub/lang/perl/CPAN/ 128.174.5.14 Massachusetts ftp://ftp.iguide.com/pub/mirrors/packages/perl/CPAN/ 206.15.105.99 New York ftp://ftp.rge.com/pub/languages/perl/ 157.225.178.12 North Carolina ftp://ftp.duke.edu/pub/perl/ 152.3.233.7 Oklahoma ftp://ftp.ou.edu/mirrors/CPAN/ 129.15.2.40 Oregon ftp://ftp.orst.edu/pub/packages/CPAN/ 128.193.4.12 Texas ftp://ftp.sedl.org/pub/mirrors/CPAN/ 198.213.9.194 ftp://ftp.metronet.com/pub/perl/ 192.245.137.6 South America Chile ftp://sunsite.dcc.uchile.cl/pub/Lang/perl/CPAN/ 146.83.5.204 For those equipped with multi-protocol browsers you might pay a visit to Tom Christiansen's CPAN multiplexer whose relevant Tk URLs are (the second one is not active since it violates the HTML-2.0 spec according to nsgmls): http://perl.com/cgi-bin/cpan_mod?module=Tk http://perl.com/cgi-bin/cpan_mod?module=Tk&readme=1 According to Stephen P. Potter some of the CPAN sites have decompression on the fly for people who do not have programs like gunzip. For example, at the ufl site (Florida USA) type this into your ftp session to download a gunzipped version of Tk: ftp> get Tk400.202.tar.gz Tk400.202.tar If you have the appropriate CPAN and FTP modules (yes there is a CPAN module for retreiving CPAN modules and its name is CPAN oddly enough) already installed you can retrieve a module from CPAN and carry out a complete installation with a perl one-liner like this: perl -MCPAN -e 'install "Tk"' For more information on CPAN you can send e-mail to the CPAN administrators, . If you know of some Perl resources that seem not to be in the CPAN (you did check the contents listings in indices/, didn't you?) please tell the CPAN administrators. If you have some modules/scripts/documentation yourself that you would like to contribute to CPAN, please read the file authors/00upload.howto and let the CPAN administrators know about it. ______________________________________________________________________ 6. How do I build it? In general, building perl/Tk requires: 1. A made & installed perl (requires a C language compiler). You may need different versions of perl depending on which version of Tk you wish to run. 2. A C language compiler for the Tk code itself. 3. A linkable Xlib (.o, .so, .a, etc.) for X-windows. Perl/Tk has been successfully built using various vendors' cc compilers, as well as with the free GNU gcc compiler. A make utility of some sort (make/ gmake) will be extremely helpful. Step - by - step the commands to build the Tk extension to Perl are (for the dynamically linked version) roughly as follows: 1. make install # the appropriate version of perl. 2. uninstall # prior versions of the Tk extension to perl. 3. gunzip -c Tk400.202.tar.gz | tar xvf - (options to tar may vary esp. on SysV) 4. cd Tk400.200 5. read INSTALL 6. perl Makefile.PL 7. make 8. make test 9. make install For the statically linked version you would `make tkperl` just after executing the `make` step and before the `make test` step. Note carefully that this process leaves behind a large amount of documentation and examples in various sub-directories. You are strongly encouraged to look carefully through your build tree for docs, examples, etc. and keep those valuable files in a safe place. You might consider tar-ing them off and installing in a webserver directory tree. A relatively easy way to determine if the perl on your system allows for dynamic linking was mentioned by Kenneth Albanowski . If the following does not say "dl_none.xs" then you probably do have dynamically linked perl (or perhaps a very non-Unixy perl): perl -e 'use Config; print $Config{dlsrc},"\n"' (thanks to Paul Lussier for the correction!). Here is a little more detailed discussion of each the steps just given: o Install Perl Read the Tk files (Tk*/README, etc.) for info on which version of perl is required for the perl/Tk kit you obtained.) For code locations see a CPAN site (separate question in this FAQ), the actual installation instructions come bundled in the perl***.tar.gz distribution file. (Perl Configure & make troubles are beyond the scope of this FAQ - please see the Perl FAQ itself or the INSTALL file for more help with this critical step.) You can install perl almost anywhere you like by specifying the -Dprefix=/path argument to sh Configure o Unpack perl/Tk outside the Perl distribution (i.e. outside the perl build, perl install, or perl lib areas). gunzip Tk400.202.tar.gz tar -xvf Tk400.202.tar (Your tar program may not take -xvf. The resultant Tk400.202/ area will be referred to as your ``Tk build'' directory throughout this document.) o Read INSTALL carefully cd Tk400.202 pager INSTALL where pager is the program you use to scroll through text files more or less. Be sure to read it and don't just pound away on the spacebar. o If necessary remove any previously installed version of perl/Tk If you had a previously working version of Tk installed, you may need to resurrect the Makefile for it and execute: make uninstall make realclean before you unpack the new version. (The uninstall target of MakeMaker is relatively new so please be careful here.) o Have perl generate a custom Makefile. perl Makefile.PL (see below for more on this step.) o Compile. make (if and only if building static: make tkperl o Test. make test o Install. make install o Play with it. basic_demo (modify #! line if necessary, or specify /path/to/perl ./basic_demo) (warning if you build Tk-b9.01 with perl5.002gamma then change the line in basic_demo from use lib ./blib; to use lib qw(blib/arch blib/lib);) o Save the documentation and examples in a safe accessible place. use tar, cp, mv, chmod or whatever you prefer to save the valuable ancillary files from your Tk build tree. On the perl Makefile.PL step it may be necessary to give explicit locations of the required X11 libraries and/or include headers. For example: perl Makefile.PL X11=/usr/local/X11R5 or perhaps different directory tree specification is necessary with your X installation: perl Makefile.PL X11INC=/usr/local/share/X11R5/include \ X11LIB=/usr/local/arch/X11R5/lib There are system and site dependencies in all of the above steps. However, the largest single source of build trouble comes from not using the latest versions of the various utilities (C compiler, make, etc.). In particular ensure that when you say perl Makefile.PL that the perl that gets invoked is up to date - use which perl (or whence perl) and perl -v to determine this. If necessary specify the full path name to your perl5 interpreter/compiler. (Some people do not rm their older perl interpreters when upgrading to a more recent version - beware.) If you still run into trouble take a look at the INSTALL, the README and the README file for your specific system (e.g. README.AIX, README.OSF, etc.). You might also find your system mentioned in the ptk hyper-mail archive at: http://www.rosat.mpe-garching.mpg.de/mailing-lists/ptk/ or http://pubweb.bnl.gov/~ptk/ or ftp://ftp.ccd.bnl.gov/pub/ptk/archives/ or the Perl 5 Porters page at one of the following URLs: http://www.rosat.mpe-garching.mpg.de/mailing-lists/Perl5-Porters/ http://www.hut.fi/~jhi/perl5-porters.html If you wish to discuss your Tk build problems with others run and save the output from the myConfig script in the Tk build directory (the output may already be in the myConfig.out file from your perl/Tk build directory), as well as the myconfig script in your perl build directory (or the output of perl -V with a capitol V). It is often helpful to include the output of either (or both) of these scripts in your discussion. Presented here are the beginnings of a list of problems associated with building perl/Tk on various platforms (for help building perl itself please refer to the Perl FAQ). This list is in no way complete nor authoritative (nor is it necessarily even up-to-date!) but simply lists problems people have reported. Keep in mind that your installation may differ (e.g. location differences such as /usr/bin/perl vs. /usr/local/bin/perl) even if its the same platform listed here: A Sampling of Perl/Tk Platforms: ++++++++++++++++++++++++++++++++ AIX: As of perl5.002b & Tk-b9.01 README.AIX says no patching is necessary. For Tk-b8: modifying the perl.exp file may be necessary. There is a patch in Tk-b8/README.AIX. It may be necessary to make regen_headers after the patch. FreeBSD: Nate Patwardhan reports no trouble at all with Tk400.200 on FreeBSD-2.1.5 or FreeBSD-2.2.1. HPUX: For Tk-b11: One person reports a need to add #define TIMEOFDAY_TZ to the tkConfig.h header file in order to compile on HPUX 9.05. Previous versions: Most people seem to prefer the dynamic linking afforded by a recent version of the gcc compiler on this system. Linux: John C. Wingenbach indicates that should you encounter an error message like Cannot find -lX11 anywhere at ./myConfig line 184 when running your perl Makefile.PL (under Slakware 3.0) that you should be more specific about -l/path/to/libX11.a. Adam Wasserman has graciously provided a compilation of Linux compilation trials & tribulations. It is an (as yet un-edited) document available at: http://w4.lns.cornell.edu/~pvhp/ptk/hints/linux_compile.txt MachTen: Mark Pease mentions that: I was able to get Tk-b11.02 running under MachTen 2.2 perl5.002_01. I did need to make one change to get a round a MachTen problem. In pTk/tclUnix.h, pwd.h is included, but it is also included in pTk/tkPort.h (which is included in Lang.h, which is use by tclUnixUtil.c, whew!) MachTen's pwd.h can't be included more that once or you get an error. It looked to me like tclUnix.h was only used in tclUnixUtil.c, so I commented out the #include in tclUnix.h. NetBSD: Jesus M. Gonzalez mentions success with: Tk-b11.01 compiles, installs and runs just out of the box in NetBSD-1.1/i386. I just followed the INSTALL instructions. NeXTSTEP: Gerd Knops recently posted a discussion of the steps to get perl running on several NeXTSTEPs to p5p. OS/2: Ilya Zakharevich has compiled a modified form of Tk-b11.02 to work with the Xfree86 client/server package, as well more advanced versions working with the Open32 PM package. OSF/1: As of perl5.002b & Tk-b9.01 you will probably be able to follow the usual instructions. John Stoffel reports that if you use gcc (rather than cc) you should use at least version 2.7.2 For Tk-b8: make is reputedly not up to the task on this system. Tk-b8/README.OSF recommends gmake instead. Stephane Bortzmeyer reports a successful build with Perl 5.001m, xsubpp 1.922, MakeMaker 4.23. He points out that it was necessary for him to upgrade the xsubpp and MakeMaker that he received with his copy of Perl5.001m. SCO: For Tk-b8: Eric J. Bohm reported a need to comment out line(s) from myConfig and GNUMakefiles using GNU make 3.67. (See Tk-b8/README.SCO for specifics.) SGI (Irix): For Tk-b11.02: Phillip Moore reports a clean build on IRIX 5.3. Matthew Black recently mentioned a need to apply "patchSG0000596" to get perl sockets to work. His message was copyrighted and is not included here. Send e-mail to him to find out where the get "patchSG0000596". Suns: SunOS (BSD): For Tk-b10 on SunOS 4.1.3_U1 using SparcWorks acc 3.0.1 Frederick L. Wagner reports needing to use the perl malloc rather than the system malloc() when building perl. For Tk-b8: Tom Tignor reports the following on SunOS (sun4m sparc): Tue, 28 Nov 1995 13:19:42 In trying to make, I got a "write: argument mismatch" error for the file ptK/Lang.h. I looked at the file and found the offending function, Tcl_GetOpenFile, which has a third argument called "doWrite" (not "write") in tkGlue.c. I changed the argument from "write" to "doWrite" in Lang.h and it's compiling fine (for the moment. :) Solaris (System V): For Tk-b8: There is trouble getting perl to use Socket routines (i.e. trouble with make perl itself not necessarily trouble with Tk-b8). See the perl FAQ for more info or the .shar file that Tom Christiansen occasionally posts to comp.lang.perl.misc. Further information on perl inter process communication can be found in the perlipc* files at: ftp://ftp.perl.com/perl/info/everything_to_know/. SVR4: For Tk-b8: Martha G. Armour and Len Reed report on two separate hardware platforms running SVR4 - extensive details in Tk-b8/README.SVR4. Interestingly, they report no trouble at all on Linux. Ultrix: Peter Prymmer reports that with Tk-b11 it was necessary to change the line in Makefile.PL that reads: 'LIBS' => ["$xlib -lX11 -lpt -lsocket -lnsl -lm"], to read: 'LIBS' => ["$xlib -lX11 -lpt -lsocket -lnsl -lm -ldnet"], because of a newer X11 in /usr/local that needed the DECnet protocol linking. John Stoffel reports a successful build of static Tk-b10 on Ultrix 4.5. Windows NT: Nick Ing-Simmons reports success with the alpha Tk404.000 kit, perl5.004, and Visual C++. non-Unix(ish)es: ++++++++++++++++ Information on non-Unix(ish) perl platforms may be obtained from newsgroups and email lists as well as a few world wide web sites. For example, try the Perl 5 Porters (p5p) [page|archives] at one of: http://www.rosat.mpe-garching.mpg.de/mailing-lists/Perl5-Porters/ http://www.hut.fi/~jhi/perl5-porters.html In general your non-Unix platform must be able to support perl 5 and Xlib (a C compiler and a make utility are tremendously useful too). If you want to run perl/Tk on another computer and simply have the display show up on yours then all you need on your computer is an "X server" The long list of UNIX and non-unix perl 5 ports, Tcl/Tk ports, and Perl/Tk ports that used to appear in this FAQ has now moved to a separate web page at: http://w4.lns.cornell.edu/~pvhp/ptk/ptkPORT.html ______________________________________________________________________ 7. Where is the Documentation? A great deal of Perl/Tk documentation gets installed as part of the Tk extension building process. Hence, a great deal of documentation is probably residing on your computer already. More documentation is "in the works": there are several books dealing with perl/Tk in progress, an ongoing magazine column and a growing FAQ (the document you are presently reading). The additional material you may want to look at can be split into Perl/Tk, Perl, Tcl/Tk, and X documentation categories: Perl/Tk Specific Documentation ++++++++++++++++++++++++++++++ The man pages ------------- With up to date Tk build kits the various perl/Tk pod documents are converted to your systems' helpfile format and installed as part of the perl/Tk "make install" process. If you have a recent verion of perl/Tk try something like man 3 Tk::Tk if this does not work check with you system administrator for the proper MANPATH. In your Tk build directory there should be a doc/ sub-directory in which there are a number of .htm files (after you make install). These files were originally Tcl/Tk man pages (from the man* sub-directories), but the *.htm files have been converted to Perl syntax and rendered in HTML format. You can use the Perl/Tk web browser to view them locally with a command like: tkweb index.html or you may view them on the web itself by installing them in a web-server directory tree, or by pointing a browser at: http://w4.lns.cornell.edu/~pvhp/ptk/doc/ The newsgroup ------------- The newsgroup name is comp.lang.perl.tk and this FAQ will be periodically posted to that group (as well as a few other newsgroups). The newsgroup and/or the ptk mailing list are the appropriate places to post questions - yes even simple ones! (Although answers may sometimes be long in coming ... :-( The nTk/pTk mailing list ------------------------ The mailing list is an excellent supplement and complement to the newsgroup comp.lang.perl.tk. All messages mailed to the list are forwarded to the newsgroup. (But not all messages posted to the newsgroup are forwarded to the list.) Some Perl/Tk experts only have access to e-mail. The nTk/pTk Mailing List Archive is a very useful source of information too, and is accesible at either http://pubweb.bnl.gov/~ptk/ or via ftp at ftp://ftp.ccd.bnl.gov/pub/ptk/archives/ (both in the USA). You may search the contents of another ptk mailing list hypertext archive thanks to a cgi-bin script written by Achim Bohnet in Germany at: http://www.rosat.mpe-garching.mpg.de/mailing-lists/ptk/ You must subscribe to the mailing list to receive e-mail from the list. To subscribe to the mailing list you can send mail to majordomo@lists.stanford.edu (i.e. ) with the following command in the body of your e-mail message: subscribe ptk joe.user@somewhere (Joe D. User) To send a message to all recipients of the mailing list send e-mail to . To remove yourself from the mailing list send e-mail to majordomo@lists.stanford.edu (i.e. ) with the following command in the body of your e-mail message: unsubscribe ptk joe.user@somewhere (Joe D. User) Where instead of "joe.user@somewhere" you might very well like to substitute another string of characters. (Please note: one does not send unsubscribe messages to the ptk list. One does send "unsubscribe ptk" messages to a special e-mail list administration program. In the case of the ptk list you send to majordomo@lists.stanford.edu. You must of course do this from the account and computer from which you initially subscribed. In particular if you are viewing the hypertext version of this FAQ you may not be able to unsubscribe from majordomo@lists.stanford.edu by following the mailto: hyperlinks - if your web-browser account/computer is different from your subscribe to e-mail-lists account/computer (the details of this might depend on which browser you use though). Thank you for your cooperation on this.) The demo programs ----------------- Examine (and try running) the code in your Tk#/ build directory tree. You might also be interested in test-running the code that gets installed: o or perl5/site_perl/Tk/demos/ or perl5/site_perl/Tk/demos/widget_lib/ directories (recent Tk's). o Tk#/ or perl5/Tk/demos/ or perl5/Tk/demos/widget_lib/ directories (older versions e.g. Tk-b8). In order to determine where on your system the perl5/ directory is located type the following one-line perl command (at your shell prompt - this is not a line from a perl script): perl -e 'print join("\n",@INC,"");' If that command does not turn up a perl5/ directory then make sure that you are running perl 5 with the following: perl -v (this too can simply be entered at the shell prompt). More on the pod & man documentation ----------------------------------- [As previously mentioned a great number of Tcl/Tk man pages are converted from *roff format to html format and are to be found within your Tk build directory tree in the doc/ sub-directory. These documents form an authoritative and extensive reference set for Perl/Tk.] The raw pod files that come with the Tk kit are examples of the perl "plain old documentation" format and are just about human readable as they are (e.g. you may more, cat, or less them; or send them to a printer). Many (not all) of the perl/Tk pod documents get are converted to *roff format and are installed in you perl man page area as part of the perl/Tk build process. If you have a recent version of perl/Tk try something like man 3 Tk::Tk. If this does not work check your manual page path with perl -MConfig -e 'print $Config{man1dir},"\n",$Config{man3dir},"\n"' And if you still cannot find the manual pages check with your system administrator for the proper MANPATH and/or Tk installation version. "Raw" .pod (such as UserGuide.pod) can be viewed with the tkpod hypertext pod viewer. Raw .pod may also be run through any one or more of a large numbers of re-formatting perl filters. Such programs include pod2man, pod2text, pod2html, pod2latex, etc. (these get installed when you install perl). Other translators pod2texinfo, pod2fm, pod2pdf, etc., also exist. Check a CPAN site for these scripts if you do not already have them. A command line like the following (but subject to local variations) should work for you: tkpod site_perl/Tk/UserGuide.pod or if you like Unix manual page style: pod2man perl5/Tk/UserGuide.pod | nroff -man | more (note that I am showing examples with almost full file path names - the alternative would be to cd into the appropriate directory then type: pod2man UserGuide.pod | nroff -man | more There should even be a perl script to run that above command for you. It is executed as: perldoc UserGuide Note that if there is pod like documentation in a perl module you may also execute tkpod (or perldoc) on it as in: tkpod ColorEditor.pm (please note that unfortunately, not all .pm mod files have pod embedded.) If you have misplaced your tkpod program but still want that GUI look and feel (like xman) make the appropriate changes to the following script: #!/usr/bin/perl use Tk; use Tk::Pod; my $m = new MainWindow; $m -> Pod(-file => 'ColorEditor.pm'); # or use command line path/filename: # $m -> Pod(-file => $ARGV[0]); MainLoop; A miscellany of internet perl/Tk resources includes: ---------------------------------------------------- World Wide Web - perl/Tk man pages http://pubweb.bnl.gov/~ptk/doc/index.html http://w4.lns.cornell.edu/~pvhp/ptk/doc/ http://w4.lns.cornell.edu/~pvhp/ptk/pod/ The Perl/Tk Newsgroup comp.lang.perl.tk Perl Newsgroups comp.lang.perl.misc comp.lang.perl.anounce comp.lang.perl.modules Tcl Newsgroups comp.lang.tcl comp.lang.tcl.announce Miscellaneous Newsgroups comp.answers news.answers Perl/Tk FAQ-Archives (ftp sites) [Note: FAQ may be many separate files] (see also CPAN sites) ftp://rtfm.mit.edu/pub/usenet/comp.lang.perl.tk ftp://rtfm.mit.edu/pub/usenet-by-hierarchy/comp/lang/perl/tk ftp://ftp.uu.net/usenet/news.answers/perl-faq/ptk-faq ftp://ftp.ccd.bnl.gov/pub/ptk/ 130.199.54.188 ftp://ftp.ccd.bnl.gov/pub/ptk/ptkFAQ.txt 130.199.54.188 ftp://ftp.wpi.edu/perl5/pTk-FAQ 130.215.24.209 ftp://perl.com/pub/perl/doc/ptkFAQ.gz 199.45.129.30 ftp://perl.com/pub/perl/doc/ptkFAQ.ps.gz 199.45.129.30 WWW-FAQ for perl/Tk http://w4.lns.cornell.edu/~pvhp/ptk/ptkTOC.html http://w4.lns.cornell.edu/~pvhp/ptk/ptkFAQ.html World Wide Web - perl/Tk info sites http://pubweb.bnl.gov/~ptk/ http://fxfx.com/kgr/compound/ (Perl Tk Compound Widget Page) http://w4.lns.cornell.edu/~pvhp/ptk/ptkIMG.html (FAQ image supplement) http://w4.lns.cornell.edu/~pvhp/ptk/etc/ http://w4.lns.cornell.edu/~pvhp/ptk/misc/ http://w4.lns.cornell.edu/~pvhp/ptk/PNMTYAK/ http://www.mirai.com/wks/ The Mailing list majordomo@lists.stanford.edu ptk@lists.stanford.edu Perl Specific Documentation +++++++++++++++++++++++++++ There are a growing number Perl books available. A more complete Perl-bibliographic discussion than that given here is available in the Perl FAQ or at: http://www.perl.com/perl/info/books.html For Perl 5 there is (as of September 1996) a "New Camel" by Larry Wall, Tom Christiansen, and Randal L. Schwartz, with Stephen Potter. Programming Perl 2nd Edition Larry Wall, Tom Christiansen, & Randal L. Schwartz with Stephen Potter (c) 1996 O'Reilly & Associates Inc. ISBN 1-56592-149-6 (English) A second edition of the Llama is due out soon too: Learning Perl, 2ndEdition Randal L. Schwartz June 1997 (est.) O'Reilly & Associates Inc. ISBN 1-56592-284-0 (English) The two early Perl books by Schwartz and Wall are very helpful (even if they do pertain to perl 4 and not 5. Beware that perl/Tk makes extensive use of perl 5 object-oriented features.): Learning Perl (The Llama) Randal L. Schwartz Copyright (c) 1993 O'Reilly & Associates Inc. ISBN 1-56592-042-2 (English) ISBN 2-84177-005-2 (French) ISBN 3-930673-08-8 (German) ISBN 4-89502-678-1 (Japanese) Programming Perl (The Camel) Larry Wall and Randal L. Schwartz Copyright (c) 1991 O'Reilly & Associates Inc. ISBN 0-937175-64-1 (English) ISBN 3-446-17257-2 (German) (Programmieren in Perl, translator: Hanser Verlag) ISBN 4-89052-384-7 (Japanese) There is also some Perl5 (book material) information at: http://www.metronet.com/1h/perlinfo/perl5/ Jon Orwant (the organizer of the comp.lang.perl.tk newgroup) has a book on Perl 5 that has a chapter that discusses the Tk extension. (Please note that it is mostly about Perl 5, there is a some discussion of four simple Perl/Tk programs, but it is not a book wholly devoted to Perl/Tk.) It is nevertheless a good introduction to object-oriented Perl 5 programming. The relevant info: Perl 5 Interactive Course Jon Orwant (c) 1996 The Waite Group Press A Division of SAMS Publishing, Corte Madera, CA USA ISBN: 1-57169-064-6 The Perl 5 Quick Reference Guide (may require LaTeX for installation) can be obtained from any CPAN ftp site. Detailed location information is also available at the author's website: http://www.xs4all.nl/~jvromans/perlref.html The quick reference guide has also been turned into a small Nutshell handbook: Perl 5 Desktop Reference Johan Vromans Copyright (c) February 1996 O'Reilly & Associates Inc. ISBN: 1-56592-187-9; Order number: 1879 Eric F. Johnson has a book that discusses many perl5 for Unix vs. perl5 for Windows NT issues. He includes a final chapter with extensive discussion of the Tk extension and the ->Text() widget in particular. The information on that book is: Cross-Platform Perl (c) 1996 Eric F. Johnson MIS:Press/M&T Books ISBN: 1-55851-483-X Kamran Husain and Robert F. Breedlove have written a perl 5 book that includes a chapter on Tk with some discussion of Menu()s. That book is: Perl 5 Unleashed Kamran Husain and Robert F. Breedlove (c) 1996 Sams Publishing, Indianapolis, IN ISBN: 0-672-30891-6 There is also a "Perl 5 How-To" book available that contains a great deal of erroneous information about perl/Tk. Among other things that book wrongly mentions that it is necessary to have a complete Tcl/Tk library installed on one's system to compile the Tk extension to perl. (They are incorrect - it is only necessary to have the appropriate perl version, libc and Xlib, the Tk extension is otherwise "self-contained"). There is also a book on perl web client. It features a a chapter on perl/Tk that was written by Nancy Walsh: Web Client Programming with Perl Clinton Wong 1st Edition March 1997 O'Reilly & Associates Inc. ISBN: 1-56592-214-X; Order number: 214X Additional book information may be found at Tom Christiansen's perl & cgi books page, or at his Perl-related Book Reviews page. The multi-part perl 5 manual pages are available (assuming they have been installed in your MANPATH, type man perl, man perlmod etc.). The perl 5 man pages are also available on the web at a number of locations. In general the more recent the documentation the more helpful it is. In addition to the CPAN ftp source sites, a miscellany of internet perl resources includes: Newsgroups comp.lang.perl.misc comp.lang.perl.announce comp.lang.perl.modules comp.infosystems.www.authoring.cgi comp.answers news.answers Perl FAQ-Archives (ftp sites) [Note: FAQ may be many separate files] (as of 5.004 the FAQ ships in pod format with perl) (see also the CPAN sites) North America ftp://rtfm.mit.edu/pub/usenet/news.answers/perl-faq/ ftp://ftp.uu.net/usenet/news.answers/perl-faq 192.48.96.9 ftp://ftp.khoros.unm.edu/pub/perl/faq.gz 198.59.155.28 Europe ftp://ftp.cs.ruu.nl/pub/NEWS.ANSWERS/perl-faq/ 131.211.80.17 ftp://src.doc.ic.ac.uk/packages/perl/FAQ 146.169.2.10 Gopher Perl FAQ gopher://gopher.metronet.com/11/perlinfo/faq WWW-FAQ for Perl http://www.perl.com/perl/faq/ http://www.smartpages.com/bngfaqs/comp/lang/perl/top.html http://www.smartpages.com/bngfaqs/comp/lang/perl/misc/top.html http://www.smartpages.com/bngfaqs/comp/lang/perl/announce/top.html http://www.cis.ohio-state.edu/hypertext/faq/usenet/perl-faq/top.html Perl for Win32 FAQ (discusses Win95) http://www.perl.org/CPAN/doc/FAQs/win32/Perl_for_Win32_FAQ.html Perl info sites Gopher (gopher:70) perl info sites USA gopher://gopher.metronet.com/11h/perlinfo World Wide Web (http:80) perl info sites USA http://www.yahoo.com/Computers_and_Internet/Languages/Perl/index.html http://www.perl.com/ http://www.khoros.unm.edu/staff/neilb/perl/home.html http://www.khoros.unm.edu:80/staff/neilb/perl/metaFAQ/ http://www.metronet.com/perlinfo/ http://www.metronet.com/perlinfo/perl5.html (Perl 5) http://www.eecs.nwu.edu/perl/perl.html http://cesr39.lns.cornell.edu/public/perl/ http://www.virtualschool.edu/mon/Perl.html http://www.hermetica.com/technologia/unexec/ http://www.oac.uci.edu/indiv/ehood/perlWWW/ http://web.sau.edu/~mkruse/www/scripts/ http://orwant.www.media.mit.edu/the_perl_journal/ http://www.perl.com/Architext/AT-allperl.html http://www.mispress.com/introcgi/ http://www.walrus.com/~smithj/webcan/ http://web.syr.edu/~chsiao05/cps600_project.html http://www.iftech.com/classes/webdev/webdev_perl.htm http://www.cc.iastate.edu/perlmenu/ http://www.ora.com/www/item/cgi_prog.html UK http://pubweb.nexor.co.uk/public/perl/perl.html http://www.bio.cam.ac.uk/web/form.html Web references to Perl mailing lists http://www.perl.com/perl/info/mailing-lists.html http://www.nicoh.com/cgi-bin/lwgate/PERL5-PORTERS/ http://www.hut.fi/~jhi/perl5-porters.html http://www.rosat.mpe-garching.mpg.de/mailing-lists/ Tcl/Tk Specific Documentation +++++++++++++++++++++++++++++ The two Tcl/Tk books by Ousterhout and Welch are very good starting points (you must however, translate the tcl-isms to perl in the sample scripts): Tcl and the Tk Toolkit John K. Ousterhout Copyright (c) 1994 Addison-Wesley Publishing Company ISBN 0-201-63337-X (alk. paper) LOC QA76.73.T44097 1994; 005.13'3--dc20 Practical Programming in Tcl and Tk Brent Welch Copyright (c) 1995 Prentice Hall ISBN 0-13-182007-9 Within the tclsh or wish shells your manpath includes the tcl/tk man pages (which may not be in your login MANPATH). Thus from the % prompt within either shell type commands like: % man -k Tk The Tcl/Tk Reference Guide is also a source of useful information. Although it's Tcl specific most perl/Tk commands can be, more or less, easily derived from it. [Note that in perl/Tk the names of some functions and some configuration options have changed slightly from their Tcl/Tk counterparts. With recent versions of perl/Tk a great many functions start with an upper case letter and continue with all lower case letters (e.g. there is a perl/Tk Entry widget but no entry widget), and many configuration options are all lower case (e.g. there is a perl/Tk highlightthickness option but no highlightThickness option).] You may fetch the Tcl/Tk Reference Guide (may require LaTeX for installation) from: ftp://ftp.slac.stanford.edu/software/TkMail/tkref-4.0.1.tar.gz 134.79.18.30 ftp://ftp.aud.alcatel.com/tcl/docs/tkref-4.0.1.tar.gz 198.64.191.10 There are a number of other Tcl/Tk resources on the internet including: Newsgroups comp.lang.tcl comp.lang.tcl.announce comp.infosystems.www.authoring.cgi comp.answers news.answers FAQ-Archive (ftp) [Note: Tcl FAQ may be many files, Tk FAQ is one file] ftp://ftp.aud.alcatel.com/tcl/docs/ 198.64.191.10 ftp://rtfm.mit.edu/pub/usenet/news.answers/tcl-faq ftp://rtfm.mit.edu/pub/usenet/news.answers/tcl-faq/tk WWW-FAQ for Tcl/Tk http://www.teraform.com/%7Elvirden/tcl-faq/ http://www.smartpages.com/faqs/tcl-faq/top.html http://www.smartpages.com/bngfaqs/comp/lang/tcl/top.html http://www.cis.ohio-state.edu/hypertext/faq/usenet/tcl-faq/top.html http://www.cis.ohio-state.edu/hypertext/faq/bngusenet/comp/lang/tcl/top.html http://www.sco.com/Technology/tcl/Tcl.html World Wide Web - Tcl/Tk info sites Canada http://web.cs.ualberta.ca/~wade/Auto/Tcl.html UK http://http2.brunel.ac.uk:8080/~csstddm/TCL2/TCL2.html http://www.cis.rl.ac.uk/proj/TclTk/ USA http://www.yahoo.com/Computers_and_Internet/Languages/Tcl_Tk/index.html http://www.sunlabs.com/research/tcl/docs.html http://www.sunlabs.com/research/tcl/4.0.html http://www.sco.com/Technology/tcl/Tcl.html http://www.neosoft.com/tcl/ http://www.elf.org/tcltk-man-html/contents.html Tcl/Tk - miscellaneous extensions ftp://ftp.cme.nist.gov/pub/expect/ http://www.cs.hut.fi/~kjk/porttk.html http://www.cis.upenn.edu/~ioi/tix/tix.html http://www.ece.cmu.edu/afs/ece/usr/svoboda/www/th/homepage.html http://www.tcltk.com/ [incr Tcl] http://www.neosoft.com/tcl/TclX.html http://www.eolas.com/eolas/webrouse/tcl.htm [WebWish] http://www.se.cuhk.hk/~hkng2/big5tk/big5tk.html http://www.cs.uoregon.edu/~jhobbs/work/ [BLT etc.] X Documentation +++++++++++++++ Tk certainly makes the generation of GUI code a lot easier than hard coding things in traditional compiled languages such as C, C++, or Lisp. Nevertheless there is a very large body of X documentation out there that will assist all widget and GUI builders with issues of design, implementation, etc. Hence it is good practice to be informed of the general design goals of X itself as well as the other toolkits that have been built on top of X. There are a number of X resources on the internet including: Newsgroups comp.windows.x comp.windows.x.announce comp.windows.x.apps X FAQs: ftp://ftp.x.org/contrib/faqs/ X FAQ on the World Wide Web: http://www.x.org/ftp/contrib/faqs/x-faq-multipart/x-faq-1 http://www.x.org/ftp/contrib/faqs/x-faq-multipart/x-faq-2 http://www.x.org/ftp/contrib/faqs/x-faq-multipart/x-faq-3 http://www.x.org/ftp/contrib/faqs/x-faq-multipart/x-faq-4 http://www.x.org/ftp/contrib/faqs/x-faq-multipart/x-faq-5 http://www.x.org/ftp/contrib/faqs/x-faq-multipart/x-faq-6 http://www.x.org/ftp/contrib/faqs/x-faq-multipart/x-faq-7 X Window System book info on the Web: http://www.x.org/ftp/contrib/docs/Xbibliography.OReilly http://www.ora.com/catalog/v1/ http://www.ora.com/catalog/v2/ http://www.ora.com/catalog/v3/ http://www.ora.com/catalog/v4/ http://www.ora.com/catalog/v5/ http://www.ora.com/catalog/v6a/ http://www.ora.com/catalog/v6b/ http://www.ora.com/catalog/v6c/ http://www.ora.com/catalog/r6/noframes.html http://www.ora.com/oracom/prog/flanart.html World Wide Web - X Window System info sites http://www.x.org/ http://www.x.org/consortium/GettingX.html http://www.x.org/consortium/x_info.html http://www.x.org/consortium/R6.1doc/man/X11/ http://www.wolfram.com/~cwikla/widget/ http://www.zeta.org.au/~rosko/pigui.htm http://www.rahul.net/kenton/xsites.html http://www.unx.com/DD/txaCurrent.shtml ______________________________________________________________________ 8. How do I write scripts in perl/Tk? Start your script as you would any perl script (e.g. #!/usr/bin/perl, #!/usr/local/bin/perl, #!/opt/bin/perl, [built static? then #!/usr/bin/tkperl], whatever, see the perlrun(1) man page for more information). Throwing the -w warning switch is recommended. The use of the statement use strict; is recommended. Use of the statement use Tk; is required. A simple "Hello World!" widget script could be written as follows: #!/usr/local/bin/perl -w use strict; use Tk; my $main = new MainWindow; $main->Label(-text => 'Hello World!' )->pack; $main->Button(-text => 'Quit', -command => sub{exit} )->pack; MainLoop; The MainLoop; statement is the main widget event handler loop and is usually found in perl/Tk scripts (usually near the end of the main procedure after the widgets have been declared and packed). MainLoop; is actually a function call and you may see it written as MainLoop();, &Tk::MainLoop;, &Tk::MainLoop();, etc. Note the use of the -> infix dereference operator. Most things in calls to perl/Tk routines are passed by reference. Note also the use of the => operator which is simply a synonym for the comma operator (well it is a bit more than that :-). In other words, the arguments that get passed to Label and Button in the above example are good old perl associative arrays (perl 5 people prefer to call them "hashes" however). Indeed, we might have written the above as: #!/usr/local/bin/perl -w use strict; use Tk; my $main = new MainWindow; $main->Label(-text , 'Hello World!' )->pack; $main->Button(-text , 'Quit', -command , sub{exit} )->pack; MainLoop; Or even as: #!/usr/local/bin/perl -w use strict; use Tk; my $main = new MainWindow; my %hello = ('-text','Hello World!'); my %quit_com = ('-text' => 'Quit', '-command' => sub{exit}); $main->Label(%hello)->pack; $main->Button(%quit_com)->pack; MainLoop; Note however, that the use of the => in the first method of writing this script makes it look more "Tcl-ish" :-). Lastly, we note the extensive use of the my function in most perl/Tk programs. my is roughly equivalent to local in Perl 4 - but is purported to be "faster and safer" as well as much more strictly local in scope. See perlfunc(1) manpage for more information on my. Other examples of code may be found in the perl5/Tk/demos/ directory and in perl5/Tk/demos/widget_lib/. (A variant on this scipt called hello is available in the file perl5/Tk/demos/hello in your own pTk distribution. Also, Source code for this and other examples from UserGuide.pod may be found at http://w4.lns.cornell.edu/~pvhp/ptk/pod/. To load code from the web save as a local filename, edit the first line to point to your perl interpreter, then: chmod u+x filename, then execute: filename.) ______________________________________________________________________ 9. What widget types are available under perl/Tk? The following Tk widget primitives are available under perl/Tk: o Button o Canvas o Checkbutton o Entry o Frame o Label o Listbox o Menu o Menubutton o Message o Radiobutton o Scale o Scrollbar o Text o Toplevel The following are Tix widget primitives available under perl/Tk: o HList o InputOnly There are (a lot of) other [compound|composite|constructs] available too. You can also synthesize new widgets out of these primitives using perl5's object-oriented multiple inheritance features. You can even build entirely new widget primitives from raw C (XS) code then use and re-use that. (Perl 5 is extremely configurable.) A good introduction to the primitives and how they may be used in conjunction with each other may be found in the widget demo script. Note that all the widget demos have a "Show Code" button. To help figure out what is happening in the script you may, when the window appears, edit the text and instrument the code with print statements and then simply press "Rerun Demo". Another place to see examples of the primitives (on the web) is at the image supplement to this FAQ at the following URL: http://w4.lns.cornell.edu/~pvhp/ptk/ptkIMG.html ______________________________________________________________________ 10. How do I get widget X to do Y ? There are a number of tasks that can be accomplished with perl/Tk widgets, configurations, and bindings (a few that can't and a few that require specific tricks). Beginners are encouraged to work through the examples in UserGuide.pod. Some examples from UserGuide.pod are addressed in this document among those that follow. Basically a widget can be "created" by simply calling the sub of the same name: my $main = new MainWindow; will set aside the necessary system memory etc. for a new MainWindow widget (it does not appear until after the MainLoop; call). The object "created" is then callable via the variable $main. So, for example, if you wanted a Button in your MainWindow, then this: $main->Button(); would be a very basic example of a widget command. If you wanted to later call this button widget you would need a "widget tag or ID" to "get a handle on it". Instead of the above call try something like: my $button = $main->Button(); The variable $button is how you refer to the Button widget in subsequent calls, such as when we call the pack routine: $button -> pack; A complete script that incorporates these ideas to make a very plain button would look like: #!/usr/bin/perl -w use Tk; use strict; my $main = new MainWindow; my $button = $main -> Button(); $button -> pack; MainLoop; But who wants such a plain looking button? You can provide a number of different widget configurations via calls to the configure routine as in: #!/usr/bin/perl -w use Tk; use strict; my $main = new MainWindow; my $button = $main->Button(); $button -> configure(-text => 'Press me!'); $button -> pack; MainLoop; The Perl motto is "there is more than one way to do it." - perl/Tk remains quite true to this motto as well. Note that the above script could have been written quite succinctly without the use of either the $main or $button variables as: #!/usr/bin/perl -w use Tk; use strict; new MainWindow -> Button(-text => 'Press me!') -> pack; MainLoop; But if you want your widgets to actually do things then you must set up callback procedures as discussed later... Do not overlook the - sign in front of some options (like -text in the above example) Another commonly overlooked problem is that elements in a hash are supposed to be strings hence a configuration option like -length +> 5, really ought to be specified as either '-length' +> 5, or "-length" +> 5, etc., rather than perl's builtin length() function. ______________________________________________________________________ 10.1. How do I get a Button to call a Perl subroutine? You may specify the -command option in the call to create & pack the button as in: $main->Button(-text => 'Print', -command => sub{do_print($filename, $font)} )->pack; Where sub do_print { } is a subroutine that handles two arguments and is declared elsewhere in the script. A full script example of the use of the above code is presented in the second example(s) in UserGuide.pod (Full source code for this and other examples from UserGuide.pod may be found at http://w4.lns.cornell.edu/~pvhp/ptk/pod/. To load code from the web save as a local file say ex1.pl, edit the first line to point to your perl interpreter, then change permission: %chmod u+x ex1.pl, then execute the script: %ex1.pl.) The above method is called the "anonymous subroutine (closure)" method. As discussed in Callback.pod one might have re-written that statement to use the "reference to a sub" method thusly: $main->Button(-text => 'Print', -command => [ \&do_print , $filename, $font ] )->pack; Note the backslash in front of \&do_print. This causes perl to generate a reference to sub do_print rather than call it. (thanks Jim Stern :-) ______________________________________________________________________ 10.2. How do I get a Button to actively change under my mouse pointer? You should specify both an '-image' and an '-activeimage' configuration option either when calling the ->Button() method or in a later separate call to the ->configure() method. Here is an example excerpted from the basic_demo script that comes with the Tk kit: #!/usr/local/bin/perl -w use Tk; $main = MainWindow->new; $QPBFile = "demos/images/QuitPB.xpm"; $QPBaFile = "demos/images/QuitPBa.xpm"; $QuitPB = $main->Pixmap('-file' => Tk->findINC("$QPBFile")); $QuitPBa = $main->Pixmap('-file' => Tk->findINC("$QPBaFile")); my $but = $main->Button('-image' => $QuitPB, '-activeimage' => $QuitPBa, '-command' => sub { $main->destroy } ) -> pack; MainLoop; __END__ ______________________________________________________________________ 10.3. How do I arrange the layout of my widgets? To control the layout and appearance of widgets in a window one makes use of a geometry manager, as well as -padding, -fill, -expand, and -anchor options of individual widgets. A geometry manager is any Tk procedure for controlling the arrangement of widgets in your application window. The predominant geometry manager used in both Tcl/Tk and perl/Tk is pack also known informally as the "packer" (other geometry managers are the "placer" and the canvas widget itself but are much less popular. There is also Nick Ing-Simmon's Table widget [discussed in a later question] and BLT_Table [which made it's way into perl/Tk thanks to Guy Decoux - but is also discussed in a later question]. So far tixForm is for Tcl/Tk only, but a perl/Tk version of Tix is in the works. You can invoke pack at the time of widget creation via calls like: $widget->pack; where widget can be any of the perl/Tk widget primitives. Widget option lists are usually passed as an associative array (hash) in parentheses thusly: $widget(-option0 => value0,-option1 => value1)->pack; pack is often used in conjunction with the frame container widget to arrange your widgets much like a hiearchically arranged set of window panes (ultimately in a rectangular "tiling" fashion of sorts). An example of this would be: my $top2 = $main->Toplevel; my $frame = $top2->Frame; $frame->pack; $frame->Label(-text => 'Left2')->pack(-side => 'left'); $frame->Label(-text => 'Right2')->pack(-side => 'right'); $top2->Label(-text => 'Bottom2')->pack(-side => 'bottom'); MainLoop; Note that pack itself is given parameters in this example. The default behavior for pack is equivalent to specifying -side => 'top' which can be overridden as in the above example. (Full source code for this and other examples from UserGuide.pod may be found at http://w4.lns.cornell.edu/~pvhp/ptk/pod/. To load code from the web save as a local file say ex2.pl, edit the first line to point to your perl interpreter, change permission using: chmod u+x ex2.pl, then type the name of your script: ex2.pl.) One of the more helpful options to pass to pack when trying to get a given widget layout "just right" is through padding: either -padx or -pady. The details of the use of pad depend on which specific widget you are trying to pack. In fact you can often add the -pad in the call to create the widget rather than in the call to pack. There is also the -anchor configuration option for widgets. A good introduction to the 9 possible -anchor (and -overanchor) values is given by the popup demo in your perl/Tk build directory. When setting a widget within a frame next to another widget one may wish to make use of the -fill => 'style' (where style = none | x | y | both) options of either pack or the widget itself. A typical situation where this is used is in setting up the Scrollbar next to a Canvas or Text widget. Another aspect to consider when laying out your widgets is their behavior under resize operations (grabbing a part of the window frame and making it bigger or smaller - details depend on your window manager). This may be controlled by the -expand option of either pack or the widget itself. ______________________________________________________________________ 10.4. How do I get a Popup to popup? For things like a simple "are you sure?" dialog box you might want to take a look at Dialog.pm which is discussed in a later question within this FAQ [16.1]. If you don't wish to require Tk::Dialog, you need something more complicated, or you simply want to create your own independent window with widgets; you must first setup a Toplevel in perl/Tk. The fourth example in UserGuide.pod gives a simple example of how to call Toplevel. Quoting from that script: my $main = new MainWindow; fill_window($main, 'Main'); my $top1 = $main->Toplevel; Where sub fill_window is declared after the call to MainLoop;. When running that script take careful note of which window pops up first, which window has grabbed the active attention of your input device(s), and which widget within the active window has the keyboard/mouse focus when all three windows are open. The use of Toplevels brings up the issue of grab - or which independent window is presently "active" and which are activatable. To make a Toplevel window active call grab thusly: $Top_widget->grab(grab_option); where $Top_widget identifies the desired Toplevel (it would be either $top1 or $top2 in the sample script referred to above). grab_option could be -global - but this is discouraged as a sign of "desparate programming style". To give a Toplevel "local grab" you may simply say: $Top_widget->grab; That is, without an argument. The use of Toplevels may also bring up the issue of focus - or which window - even which widget within a window - is presently "hot". You may call focus on an entire Toplevel: $Top_widget->focus; However, focus is most often used with individual widgets rather than a whole Toplevel. To de-iconify a widget there is in fact a Popup function that may be called thusly: $Top_widget->Popup(); ______________________________________________________________________ 10.5. How do I bind keyboard keys? There are many default key bindings built in to the widgets of perl/Tk. Making proper use of them often involves setting up the right callback. (You may wish to consult the examples in BindTable.pod for help with this subject.) The basic idea is: $widget -> bind('' => action); Where $widget is the tag or ID of the widget for which the bindings are to hold (note for global bindings you have to bind to , for semi-global bindings you need to bind to all the relevant widgets in your application), '< keyname>' can be things like: or or