From: claird@phaseit.net
(Cameron Laird)
Newsgroups: comp.lang.perl.tk,comp.lang.perl.announce,comp.answers,news.answers
Subject: comp.lang.perl.tk FAQ
Followup-To: comp.lang.perl.tk
Approved: news-answers-request@MIT.EDU
Summary: comp.lang.perl.tk Frequently Asked Questions.
Archive-name: perl-faq/ptk-faq
Posting-Frequency: monthly
Last-modified: Date: June 2018
URL: http://www.cpan.org/authors/id/C/CL/CLAIRD/ptkFAQ.html
Version: 1.01_00
[THESE ARE DEFUNCT.]
URL (Hypertext-split):
URL (Plaintext):
Image-supplement:
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
<nik@tiuk.ti.com>
whose 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
<claird@phaseit.net>.
Please note: from 1997-2000, this FAQ was largely quiescent.
On 25 September 2000, Cameron Laird assumed its responsibility
from Peter Prymmer, established a new home URL
(see above; the
phaseit.net
copy is always at least
as current as the others) for it, and
began to update its content. As 2001 closes, I'm still
correcting out-of-date information, ensuring that all
hyperlinks are live, and erratically folding in
contributed material that arrives. I've abandoned the
search for a more permanent custodian for the Perl/Tk
FAQ. I do have ambitions, though, of combing the Web
for outdated copies of this document and co-operating
with site managers to bring them to the present.
Perl/Tk FAQ
- What is Perl/Tk?
- What is the difference between Perl/Tk and Tkperl? Are there ways beside Perl/Tk to do graphics with Perl?
- Do I need Tcl/Tk in order to build Perl/Tk?
- Where is it?
- What/Where is CPAN?
- How do I build it?
- Where is the Documentation?
What training is available?
- How do I write scripts in Perl/Tk?
- What widget types are available under Perl/Tk?
- How do I get widget X to do Y ?
- How do I get a Button to call a Perl subroutine?
- How do I get a Button to actively change under my mouse pointer?
- How do I arrange the layout of my widgets?
- How do I get a Popup to popup?
- How do I bind keyboard keys?
- How do I add bindings?
How do I change or remove bindings?
- How do I bind the action of a slider (sic) to ... ?
- How do I configure a Scrollbar to scroll multiple widgets?
- How do I display a bitmap?
- How do I display an image?
- What Image types are available?
- Is there any way to have more than one Listbox contain a selection?
- How do I select a range of tags in a Text widget?
- How do I group Radiobuttons together?
- How do I specify fonts?
- How do I get the entry in an Entry?
- How do I hide a password Entry?
- How do I limit an Entry's insertion width?
- How do I obtain Menus that do not tear off?
- How do I replace the default window icon?
- How do I prevent a window from closing when a user clicks on the 'cross-field' in the upper-right corner?
- How do I implement 'drag-n-drop'?
- How do I write the contexts of a text widget to an external file?
- How do I center a window?
- How do I prevent iconification of a window, or otherwise manage minimization and maximization?
- How do I keep a window on top of the screen?
- How do I get a Canvas to ... ?
- Display a bitmap?
- Erase a display?
- Display an Image?
- What things can be created on a Canvas?
- How do I redraw a line on a Canvas?
- How do I use the Canvas as a geometry manager?
- How do I get a Canvas to output PostScript(c)?
- How do I get a PostScript(c) output of a Canvas w/ widgets?
- How do I get the size of a Canvas? After a re-size?
- How do I bind different actions to different areas of the same Canvas?
- How do I rotate text?
- Common Problems.
- What do the ->, => and :: symbols mean?
- What happened to the ampersands &?
- What happened to the quotation marks?
- Must I use "my" on all my variables?
- Is there a way to find out what is in my Perl/Tk "PATH"?
- What is the difference between use and require?
- How do I change the cursor/color?
- How do I ring the bell?
- How do I determine the version of Perl/Tk that I am running?
- How do I call perl from C?
- How do I call Tcl code from Perl/Tk?
- How do I determine the screen resolution?
- Is there a fileevent
problem?
- What are some of the primary differences between Tcl/Tk and Perl/Tk?
- How do I install new scripts | modules | extensions?
- How do I write new modules?
- Composite Widgets.
- How do I get a Dialog box?
- Is there a file selector?
- Is there a color editor?
- Is there a round Scale?
- Is there something equivalent to tkerror?
- Are there Tables?
- Programming/development tools.
- Is there a Tcl/Tk to Perl/Tk translator?
- Is there something equivalent to
wish
in Perl/Tk?
- Is there a debugger specifically for Perl/Tk?
- Is there a GUI builder in Perl/Tk?
- How do I compile Perl/Tk scripts?
- Processes & Inter-Process Communication under Perl/Tk.
- How does one get Perl/Tk to act on events that are not coming from X?
- Is there a send and do I need xauth?
- How can I do animations using after?
- How do I update widgets while waiting for other processes to complete?
- How do you fork?
- How do I "clear the screen"?
- Is there a way to have an X application draw inside a Perl/Tk window?
- Is there a version for Microsoft Windows(tm)?
MacOS? Is there a browser plugin?
- Are there any international font packages for Perl/Tk?
- Are there any other ways to create event based interfaces from perl?
- Where can I get more information on graphics (modules|scripts)?
- Are there any major applications written in Perl/Tk?
- What is the history of pTk and Perl/Tk?
- What can we expect the future to hold?
- How do I obtain the latest version of this FAQ?
- Acknowledgements & maintainer.
Return to table of contents
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 8 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 (as of February 2003) of Perl/Tk is based on
Tk8.0 (first released in 1998), the widget
Toolkit originally associated with the Tcl
(Tool command language) scripting
language. However, from a Perl perspective, Perl/Tk does not
require any familiarity with Tcl, nor does its installation
depend on any Tcl code apart from that packaged within Perl/Tk.
Perl/Tk uses perl 5 syntax, grammar, and data
structures. On the other hand, this distinction means
little to those just beginning with Perl; for them,
there's simply a large mass of material that must be
learned, and no particularly comprehensive exposition
of it is available online. It often happens that those
in search of Perl/Tk documentation are sent to Tcl/Tk
for specific aspects.
The production release of Perl/Tk
was written primarily by Nick Ing-Simmons
<Nick.Ing-Simmons@tiuk.ti.com>
at Texas Instruments in Northampton, England, to work with the latest version
of Larry Wall's ``perl''.
Plans are afoot to track such enhancements as Tk 8.4 and Perl 6.
The pTk code proper is an externally callable Tk toolkit
(i.e. a re-write of the Tk 8.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.
Return to table of contents
2. What is the difference between Perl/Tk and Tkperl?
Are there ways beside Perl/Tk to do graphics with Perl?
[OBSOLETE; move to historical section.] TkPerl was originally the name of a (now unsupported) perl 4 package
that Malcolm Beattie
<mbeattie@sable.ox.ac.uk>
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? :-).
Are there modern ways to do graphics with Perl besides Perl/Tk?
Absolutely--quite a few, in fact. [CL will document these more
completely in 2003.] Among the alternatives are:
- PerlQt, at release
3 as of early 2003;
- Web applications [...];
- GNOME binding [...];
- ...
- [describe book];
Note that many more applications seem to have been built
with Perl/Tk than with any of the other direct toolkit bindings.
Return to table of contents
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, Presentation Manager, or Win32; 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 components is discussed in a bit more detail (with an
emphasis on Xlib).
Return to table of contents
4. Where is it?
Source code
The
latest production and alpha releases
are available from the
modules/by-authors/Nick_Ing-Simmons/
directory on the
CPAN.
If building from source code you will need a made and installed perl
(Perl 5.005 or later being an excellent choice), a recent
MakeMaker and the Tk 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.
ActiveState Corporation
has taken over the chore of maintaining
what originated as Gurusamy Sarathy's
binary
distribution for
WinNT, Win95, Win98, and Win2000. [Mention license
considerations here?] This is what you must do to
"use Tk" with
ActivePerl:
- Download and install version 1.1 or greater of the
Windows Installer
(while the installation claims a reboot is necessary,
Cameron Laird found it not to be so for WinNT);
- Download the ActivePerl 618 distribution:
- From Windows Explorer, activate the distribution just
downloaded; from the command line,
start ActivePerl-5.6.0.618-MSWin32-x86-multi-thread.msi
.
This installs ActivePerl;
- From a command line, invoke
ppm install Tk
;
- At this point, you can
perl -e "use Tk"
from a command line, and you're ready to code Perl/Tk source.
Jon Bjornstad gives
more
details about the process, some of which you might
particularly need if you work with ActivePerl before release
618. Philip
Yuson's
wide-ranging
writings on Perl
for the Suite101.com
site include a
careful
explanation of how to install the Tk module. Note that
ActivePerl is also available for Linux and Solaris.
ppm
should work fine for
Perlites behind firewalls, as it's SOAP-transported.
ActivePerl 623 exploits SOAP-lite to fix all known firewall
and
proxy-service problems with ppm
retrieval.
Other possibilities (while you should always
check your ActivePerl license before taking any
of these actions, in general use that doesn't
involve resale is OK) include:
- locating the appropriate
.ppm
on the ActiveState Web site
(anyone taken the time to track it down?),
and manipulating
it locally once it's passed through the firewall;
or
- making a working ActivePerl+Tk image on a personal
machine, and importing required files through
sneakernet or a morally-equivalent means.
The instructions of the previous paragraphs
all the information necessary
for these operations. Note that purchase of
the ActivePerl CD-ROM does not put
the Tk module in your hand; CD-ROM holders
must install it, presumably from the ActiveState
site.
(While the next question treats CPAN in detail, the remainder of this
answer points out some non CPAN resources, as well as some
historical 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 Read Only Memory Compact Disk
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 noticed that some tend to be a few months out of date with respect to
CPAN so please be careful).
See the hypertext version of this document for hyperlinks to the
following vendors:
- Perl Developer's Toolkit from
Advice Press; 366 Cambridge Ave.; Palo Alto, CA 94306
- ISBN: 1-889671-15-0 $39.95, is also available via a subscription plan.
This CD is organized by Jon Orwant (the organizer of
comp.lang.perl.tk and
the publisher of The Perl Journal.
- Walnut Creek
Perl CD
from Walnut Creek CDROM; 4041 Pike Lane, Suite E; Concord, CA 94520
- 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.
Return to table of contents
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:
- The latest Tk release should be in the
modules/by-authors/Nick_Ing-Simmons/ directory
at any CPAN ftp site (listed below).
- 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).
- A recent binary distribution of perl+Tk+many other modules should
bin in the
modules/by-authors/Gurusamy_Sarathy/
at any CPAN ftp site (listed below).
- If you need something older or newer than the
"latest supported release" of Perl 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:
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:
- 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.
- 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:
- Assorted documentation for perl is in the doc/ directory
at any CPAN ftp site (listed below).
- 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:
- 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).
- 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 would include things like:
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
Some of the CPAN sites are fully accessible via hyper text transport protocol.
Among them:
http://www.cdrom.com/pub/perl/CPAN/
http://www.metronet.com/perlinfo/
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 the CPAN you can send e-mail to the CPAN
administrators,
<cpan-adm@ftp.funet.fi>.
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.
Return to table of contents
6. How do I build it?
"GUI
construction with Perl" is a modern treatment of what's
involved in use of Perl/Tk. It specifically details how
first-time Perl/Tk programmers can install Perl/Tk usefully.
Assuming you are not running a binary distribution then, in general,
building Perl/Tk requires:
- 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.
- A C language compiler for the Tk code itself.
- 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.
[OBSOLETE] Step - by - step the commands to build the Tk extension to Perl are (for the
dynamically linked version) roughly as follows:
- make install # the appropriate version of perl.
- uninstall # prior versions of the Tk extension to perl.
- gunzip -c Tk400.*.tar.gz | tar xvf -
(tar options may vary esp. on SysV)
- cd Tk400.*
- read INSTALL
- perl Makefile.PL
- make
- make test
- 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 <kjahds@kjahds.com>.
If any of the following does not say "dl_none.xs" then you
probably do have dynamically linked perl (or perhaps a very non-Unixy perl):
perl -V:dlsrc
or
perl -MConfig -e 'print $Config{dlsrc},"\n"'
or
perl -e 'use Config; print $Config{dlsrc},"\n"'
(thanks to Paul Lussier <plussier@isd.3com.com> for the correction!).
Here is a little more detailed discussion of each the steps just given:
- 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
- [OBSOLETE] Unpack Perl/Tk outside the Perl distribution
(i.e. outside the perl build, perl install, or perl lib
areas).
gunzip Tk400.*.tar.gz
tar -xvf Tk400.*.tar
(Your tar program may not take -xvf.
The resultant directory area will be referred to
as your
``Tk build'' directory throughout this document.)
- [OBSOLETE] Read INSTALL carefully
cd Tk400.*
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.
- 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.)
- Have perl generate a custom Makefile.
perl Makefile.PL
(see below for more on this step.)
- Compile.
make
(if and only if building static: make tkperl
- Test.
make test
- Install.
make install
- 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);)
- 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:
- 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:
-
[OBSOLETE] Nate Patwardhan <nvp@nfic.com> 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 <awasser@hermes.sgc.com> 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 <pease@act.sps.mot.com>
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 <pwd.h> in tclUnix.h.
- NetBSD:
-
Jesus M. Gonzalez <jgb@gsyc.inf.uc3m.es> 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
<ilya@math.ohio-state.edu>
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 <john@wpi.edu> 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
<bortzmeyer@pasteur.fr>
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
<bohm@cs.Buffalo.EDU>
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 <wpm@morgan.com> reports a clean build on
IRIX 5.3.
Matthew Black
<black@csulb.edu> 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 <derf@ti.com> reports
needing to use the perl malloc rather than the system malloc() when building
perl.
For Tk-b8:
Tom Tignor <tpt2@BBN.COM> 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:
-
[OBSOLETE] Nick Ing-Simmons reports success with the alpha Tk404.000 kit, perl5.004,
and Visual C++. Gurusamy Sarathy has distributed a binary kit with
perl,Tk,etc. precompiled for Windows 32. Support is continuing
to allow extension by the Borland C++ compiler as well as cross compiler
extendability.
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
Return to table of contents
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. The best place to start
is with the first two entries in `perldoc Tk`.
It's worth installing
ActivePerl
just for its HTMLized
documentation of Perl and its modules.
The one book easiest to recommend is
Lidie and Walsh's
Mastering
Perl/Tk, published in February 2002.
Until then, Nancy Walsh's
Learning
Perl/Tk: Graphical User Interfaces with Perl
was the standard.
While the latter is intended as an introduction, and it's generally
agreed that it doesn't "go beyond the obvious", as
Robert Boyd Skipper put it, its competent index
makes it valuable also for more experienced Perl/Tk users.
The book deserves a second edition; it doesn't represent the
current situation of, for example, Perl/Tk under Windows at
all justly.
Srinivasan's
Advanced
Perl Programming has
a single chapter on Perl/Tk which matches the quality
of the rest of the book--that is, it's quite dense yet
readable. It's hardly appropriate as a general
introduction, though. Several people cite Lidie's
Perl/Tk
Pocket Reference as indispensable. Also,
one of Larry Virden's
Tcl FAQs
aims to catalogue Perl books with coverage of Tk.
More documentation is "in the works": there are several books
dealing with Perl/Tk in progress (one from Steve Lidie?), 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:
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 name is comp.lang.perl.tk.
During the first few years of the FAQ, it was
periodically posted there, along with 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 ... :-(
For background on the theory and operation of Usenet newsgroups,
see the references maintained
as part of the Tcl-ers' Wiki. Information there includes tips
on how to read and write to newsgroups such as comp.lang.perl.tk.
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 accessible at either
http://groups.yahoo.com/group/ptk/
(but will someone please change the out-of-date introduction?),
http://pubweb.bnl.gov/~ptk/
or via ftp
at
ftp://ftp.ccd.bnl.gov/pub/ptk/archives/
(all 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.
<majordomo@lists.stanford.edu>)
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 <ptk@lists.stanford.edu>.
To remove yourself from the mailing list send e-mail
to majordomo@lists.stanford.edu
(i.e. <majordomo@lists.stanford.edu>)
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:
- or perl5/site_Perl/Tk/demos/ or
perl5/site_Perl/Tk/demos/widget_lib/ directories
(recent Tk's).
- 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
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 forthcoming book from major Perl/Tk contributor Sriram Srinivasan is:
Advanced Perl Programming
By Sriram Srinivasan
1st Edition August 1997 (est.)
O'Reilly & Associates Inc.
ISBN: 1-56592-220-4, Order Number: 2204
440 pages (est.), $34.95 (est.)
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 claims 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
https://www.guru99.com/perl-tutorials.html
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
http://www.perlring.org/perlwin32.html (this seems to be what formerly was "perlring")
UK
http://pubweb.nexor.co.uk/public/perl/perl.html
http://www.bio.cam.ac.uk/web/form.html
Elsewhere
http://www.oasis.leo.org/perl/00-index.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/
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://tix.sourceforge.net
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
Return to table of contents
7.B. What training is available?
Many suppliers offer Perl classes. CL knows of
no current list that even pretends to be comprehensive.
Few of these training sessions cover Perl/Tk. CL knows of
none currently scheduled in 2001.
Return to table of contents
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.)
Return to table of contents
9. What widget types are available under Perl/Tk?
The following Tk widget primitives are available under Perl/Tk:
The following are Tix widget primitives available under Perl/Tk:
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
Return to table of contents
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.
Return to table of contents
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 :-)
Return to table of contents
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__
Return to table of contents
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.
Return to table of contents
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();
Return to table of contents
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('<keyname>' => 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
<All>, for semi-global bindings you need to bind
to all the relevant widgets in your application), '<keyname>'
can be things like:
<Key> or <KeyPress> or <Any-KeyPress>
<KeyRelease>
<Button> or <ButtonPress>
<ButtonRelease>
<Button-1> or <B1>
<Double-1>
<Enter>
<Leave>
<Motion>
To figure out what names Perl/Tk uses for such <bindings> use the
"binder-finder" on a widget's .pm file. For example, you could find
bindings hidden inside of Button.pm by typing this at your
shell prompt:
perl -ne 'print if s/.*(<[^>]*>).*/$1/g;' Button.pm
while in the directory where Button.pm is located (and if you are
not there then simply specify the /path/to/Button.pm).
Note that due to inheritance (e.g.the type of script bindings that are
being discussed here) what the binder-finder turns up may not be the last word
on a given widget's behaviour. This may be especially true for a widget inside
of a compound/composite widget.
Note also that the binder-finder will turn up things like <FILEHANDLES>
as well as honest <Bindings>. Discrimination in its use is called for
(and while your at it you could have just as easily used an editor and actually
examined the code directly now couldn't you?).
To get an idea of what the code is for a key that you are interested
in try running the xlib_demo that comes in your Perl/Tk build
directory. Hold your mouse pointer over the window that appears and simply
type the key that you are interested in. The code should appear in the window.
If you do not have Perl/Tk up and running yet try
"xmodmap -pk" or look directly at the
/usr/include/X11/keysymdef.h file where keysym names are given with
an XK_ pre-pended. Do not try things like the Tcl/Tk %k
symbols in perl scripts. %Ks will be mis-interpreted as
non-existant perl hashes. Instead look at the Xevent function.
Ali Corbin
<corbin@adsw.fteil.ca.boeing.com> recently posted a great
little script for determining keyboard key bindings on a MainWindow:
#!/usr/local/bin/perl -w
use Tk;
$top = MainWindow->new();
$frame = $top->Frame( -height => '6c', -width => '6c',
-background => 'black', -cursor => 'gobbler' );
$frame->pack;
$top->bind( '<Any-KeyPress>' => sub
{
my($c) = @_;
my $e = $c->XEvent;
my( $x, $y, $W, $K, $A ) = ( $e->x, $e->y, $e->K, $e->W, $e->A );
print "A key was pressed:\n";
print " x = $x\n";
print " y = $y\n";
print " W = $K\n";
print " K = $W\n";
print " A = $A\n";
} );
MainLoop();
To bind the action of one widget to that of another try taking a
look at the .pm file for the widget of interest - is there a binding
function already defined? If so you may use it. An example would be the use of
"Up" & "Down" Buttons for a
Listbox: one could bind the Buttons to call
Tk::Listbox::UpDown, however, Guy Decoux describes a much more
clever way to use the <Up> and <Down> already
defined in Listbox.pm (this does not work with Tk-b9.01):
#!/usr/local/bin/perl
use Tk;
$top = MainWindow->new;
$lb = $top->Listbox(-height => 10);
for($i=0; $i < 120; $i++) {
$lb->insert('end', $i);
}
$f = $top->Frame;
$up = $f->Button(
-text => "Up",
-command => [ $lb->bind(ref $lb, '<Up>'), $lb]
);
$down = $f->Button(
-text => "Down",
-command =>sub {&{$lb->bind(ref $lb, '<Down>')}($lb)}
);
$up->pack(-side => 'left');
$down->pack;
$f->pack;
$lb->pack;
MainLoop;
Return to table of contents
10.6. How do I add bindings? How
do I change or remove bindings?
On Fri, 15 Sep 95 10:30:56 BST
Nick Ing-Simmons <Nick.Ing-Simmons@tiuk.ti.com> writes:
Re: Multiple binds to a single widget?
**************************************
On Thu, 14 Sep 1995 14:57:54 -0400
Alain St <astdenis@cmc.doe.CA> writes:
!In the tcl/tk doc I have, they say that prepending the script
!with '+' appends the new binding to the current one.
!
!How do I do that in perlTk?
!
You cannot do that that way (yet?) - one issue is what it would mean
to prepend '+' to a Perl/Tk callback :
$widget->bind('<A>','+',[\&subname,$arg]);
# did not look right to me
Other issue is that I would need to manage a list-of-callbacks in glue code.
Bind your new command to a new tag:
$widget->bind('Extra',....);
And add Extra to the widgets bindtags:
$widget->bindtags([ref($widget),$widget,'Extra',
$widget->toplevel,'all']);
To change or remove a binding, you generally have two
alternatives. Note that a simple-minded
$widget->bind(...)
will not give you
what you want. Instead, the possibilities are:
- Make a subclass for the widget and put the changed and removed
bindings into the ClassInit method:
package Tk::NewTextClass;
use base qw(Tk::Text);
Construct Tk::Widget 'NewTextClass';
sub ClassInit {
my($class,$mw) = @_;
$class->SUPER::ClassInit($mw);
$mw->bind($class,'' => \&Tk::NoOp); # remove
$mw->bind($class,'<1>' => sub { warn "B1 pressed" }); # change
}
- Change the binding order by using the bindtags() method. In contrast
to Tcl/Tk, Perl/Tk class bindings normally precede widget bindings:
- Tk::WidgetClass
- .toplevel.widgetpathname (that is, the string
$widget->PathName returns)
- .toplevel
- all
Use bindtags()
to change the order, and bind() to
overwrite or remove bindings:
$widget->bindtags([$widget,ref $widget,$widget->toplevel,'all']);
$widget->bind(...);
See also page 374 of Mastering Perl/Tk.
Return to table of contents
10.7. How do I bind the action of a slider (sic) to ... ?
Technically speaking they are called Scrollbars (not sliders) and one
must configure the action of the desired widget to call the
Scrollbars (i.e. bind
is not involved here)
A common task using Scrollbars is to configure things
like Canvas, Listbox, or a Text widgets to be
updated (change appearance) when the slider of the acompanying
Scrollbar is moved by the user.
As an example consider the code that sets up a twelve element Listbox
and an accompanying vertical Scrollbar:
my $main = new MainWindow;
my $box = $main->Listbox(-relief => 'sunken',
-width => -1, # Shrink to fit
-height => 5,
-setgrid => 'yes');
my @items = qw(One Two Three Four Five Six Seven
Eight Nine Ten Eleven Twelve);
foreach (@items) {
$box->insert('end', $_);
}
my $scroll = $main->Scrollbar(-command => ['yview', $box]);
So far so good. But merely setting them up does not mean that the
Listbox even knows that the Scrollbar is lying next to
it. Note that the scalar variable $scroll
is how we
refer to the Scrollbar, thus, hooking the $box
up to
handle $scroll
events is a matter of configuration:
$box->configure(-yscrollcommand => ['set', $scroll]);
A complete script that makes use of this code (and adds the necessary
calls to pack
and MainLoop;
) is given as
the fifth example in
UserGuide.pod (and may be
found at http://w4.lns.cornell.edu/~pvhp/ptk/pod/.)
There was an old Perl/Tk tendency to have a bunch of ScrlFoo
widgets (such as ScrlListbox). The use of such widgets is now
deprecated in favor of a new Scrolled class, as in:
$w = $patent->Scrolled('Text',...);
The widgets that can be ->Scrolled() include:
- Canvas (::Axis)
- Entry
- Ghostview
- HList
- HTML (::Web)
- Listbox
- Pod
- Text (::ROText) (::TextUndo)
- Tiler
Return to table of contents
10.8. How do I configure a Scrollbar to scroll multiple widgets?
Note that the widget type that you wish to scroll can be important as a scroll
"unit" on a Text or Listbox may be a character
(several pixels - depending on font) whereas it would be an X "units"
on a Canvas (could be pixel - but you may also specify other units).
A concrete answer for scrolling 3 Listboxes
comes courtesy of Frederick L. Wagner <derf@ti.com>.
Note that there's an outstanding question about whether
such listboxes always stay precisely synchronized; there's suspicion
that there might be an unaccomodated dependency in the
widget implementations on font details.
From a working example of multi-xscrolling:
sub multiscrollx
{ # multiscrollx
my ($sb,$wigs,@args) = @ARG;
my $w;
foreach $w (@$wigs)
{
$w->xview(@args);
}
} # multiscrollx
# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
$sh->configure( -command => [ \&multiscrollx, $sh,
[$scratchrule,$ruleheader,$ruletable]]);
$ruletable->configure( -xscrollcommand => [ 'set', $sh]);
$ruleheader->configure( -xscrollcommand => [ 'set', $sh]);
$scratchrule->configure(-xscrollcommand => [ 'set', $sh]);
In this case,
$sh is a horizontal Scrollbar,
$ruletable and $scratchrule are Tables
$ruleheader is an Entry
However, this approach is good for any widget with
X-scrolling capability, I think.
So the Y counterpart should be:
sub multiscrolly
{ # multiscrolly
my ($sb,$wigs,@args) = @ARG;
my $w;
foreach $w (@$wigs)
{
$w->yview(@args);
}
} # multiscrolly
# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
$sv->configure( -command => [ \&multiscrolly, $sv,
[$l1,$l2,$l3]]);
$l1->configure( -yscrollcommand => [ 'set', $sv]);
$l2->configure( -yscrollcommand => [ 'set', $sv]);
$l3->configure( -yscrollcommand => [ 'set', $sv]);
Hope that helps.
Craig Votava has explored the challenge of synchronizing
the scrolling of different widgets.
As
he
writes,
"My solution is to simply pick a master widget, and always
have it force the slave to its position."
#!/usr/sbin/perl
use strict;
use Tk;
# Create new text window...
my $top = MainWindow->new;
# Create top frame for everything up top...
my $tf = $top->Frame()->pack(-side => 'top', -fill => 'both', -expand => 'True');
# Create Right Text widget...
my $rtxt = $tf->Text( -width => 20, -wrap => 'none' )->
pack(-side => 'right', -fill => 'both', -expand => 'True');
# Create Left Text Widget...
my $ltxt = $tf->Text( -width => 10, -wrap => 'none' )->
pack(-side => 'left', -fill => 'y', -expand => 0);
# Create tags for alternating colors...
$ltxt->tag('configure', 'LIGHT', -background => 'lightgrey');
$ltxt->tag('configure', 'DARK', -background => 'grey');
$rtxt->tag('configure', 'LIGHT', -background => 'lightgrey');
$rtxt->tag('configure', 'DARK', -background => 'grey');
# Setup vertical scroll bar for both text windows...
my $yscroll = $tf->Scrollbar( -command =>
sub {
$ltxt->yview(@_); # Scroll master
my @tmp=$ltxt->yview; # Get master end position
$rtxt->yviewMoveto($tmp[0]) } # Scroll slave to master
)->pack(-fill => 'y', -side => 'left');
# Connect up Y scrollbar to text widgets...
$ltxt->configure( -yscrollcommand => [$yscroll => 'set'] );
$rtxt->configure( -yscrollcommand => [$yscroll => 'set'] );
my ( $i, $tag);
foreach $i (@{[1..100]}) {
if($i % 2) { $tag='LIGHT' } else { $tag='DARK' };
$rtxt->insert('end', "This is line $i\n", $tag);
$ltxt->insert('end', "$i\n", $tag);
}
MainLoop();
There's an outstanding question about whether this approach works
in general
for widgets with different fonts.
Greg VanSickle <vansickl@bnr.ca> points out
that this little script snippet does not provide for the binding of
'<Button-2>' that he is accustomed to. He wrote
a package called DSListbox to address this
binding issue.
Stephen Patterson notes that @ARG above only works as intended
if the English module has been loaded with a
use English;
In its absence, it's better to substitute @_ for @ARG.
Conversely, Jong Park asked how to setup multiple Scrollbars to
scroll the same widget. Nick Ing-Simmon's reply makes use of an anonymous sub
and can be summed up in a little script that scrolls a Text widget
(to see the scrolling in action type more than 20 lines of text into the widget):
#!/usr/local/bin/perl -w
use Tk;
my $mw = MainWindow->new();
my $s1 = $mw->Scrollbar(-orient => 'vertical');
my $s2 = $mw->Scrollbar(-orient => 'vertical');
$s1->pack(-side => 'left', -fill => 'y');
my $t = $mw->Text(
-yscrollcommand => sub{$s1->set(@_), $s2->set(@_)},
-wrap => 'word',
-width => 70,
-height => 20,
-font => $font,
-setgrid => 1,
)->pack(-side => 'left');
$s2->pack(-side => 'right', -fill => 'y');
$s1->configure(-command => [$t => 'yview']);
$s2->configure(-command => [$t => 'yview']);
MainLoop;
__END__
Return to table of contents
10.9. How do I display a bitmap?
You can display X bitmaps on your widgets with the -bitmap
configuration option. Typically -bitmaps are configured
into Label, Frame,
Button, etc. widgets (Canvas widgets are another
story however see question [11.1] below).
In order to emphasize the bitmap option itself let us assume we were
specifying a bitmap for a Label with a call like:
$main->Label(-bitmap => 'bitmap-name')->pack;
Where bitmap-name could be any of the built in Tk bitmaps:
error, gray25, gray50, hourglass,
info, question, questhead,
warning (see the widget demo for a full list).
In order to use some of the bitmaps in the perl5/Tk/demos/images/
directory you would specify a fuller path name like:
$main->Label(-bitmap => "\@$tk_library/demos/images/face")->pack;
Note the escaped "\@" on the directory specification (as
well as the use of the $tk_library variable imported by use
Tk;). If you wanted to specify a file called foobar.xbm in
the directory where you were running the script then either:
$main->Label(-bitmap => '@foobar.xbm')->pack;
#or
$main->Label(-bitmap => "\@foobar.xbm")->pack;
should work just fine. In another directory however that would be a problem.
So something like:
$main->Label(-bitmap => "\@$ENV{'HOME'}/img/foobar.xbm")->pack;
will help someone who has an img/foobar.xbm file in their $HOME
directory. If you don't mind the non-portability then hard-wiring in the full
path name will help as well. (Or if you have write access then put your files
in Tk/demos/images/ e.g.)
Return to table of contents
10.10. How do I display an image?
You will want to get a "Photo" handle on the file as in
the following example where 'imggif' is the Photo handle for a gif
file that is distributed with Perl/Tk:
#!/usr/bin/perl -w
use strict;
use Tk;
my $main = new MainWindow;
$main ->Label(-text => 'Main')->pack;
$main -> Photo('imggif',
-file => "$Tk::tk_library/demos/images/earth.gif");
my $l = $main->Label('-image' => 'imggif')->pack;
$main->Button(-text => 'close',
-command => sub{destroy $main}
)->pack(-side => 'left');
$main->Button(-text => 'exit',
-command => [sub{exit}]
)->pack(-side => 'right');
MainLoop;
(Canvas widgets are another story however
see question a later question within this FAQ).
Return to table of contents
10.11. What Image types are available?
In addition to the Tk builtin bitmaps there is support for reading
images from files in formats such as:
X11 Bitmaps (.xbm), X Pixmaps (.xpm), and Graphics Inline Format (.gif). See
the CrtPhImgFmt man page for more info (if you have Tk 4.X
installed). (In order to support other formats you might also consider running
through a netpbm filter.)
For perl generation of images see the question (later in this FAQ) on graphics modules.
Return to table of contents
10.12. Is there any way to have more than one Listbox contain a selection?
To allow more than one Listbox to contain a
"selection", (or at least a highlighted item - which need not be the
actual selection) specify the configuration option:
-exportselection => 0
which will dis-associate Listbox's selection from X selection
(only one window can have X selection at a time).
Here is a rather simple script that illustrates
what happens when only one Listbox has
-exportselection => 0 specified:
#!/usr/bin/perl -w
use Tk;
my $main = MainWindow->new;
my @fruits = ('Apple','Banana','Cherry','Date','Elderberry','Fig');
my @nuts = qw(Almond Brazil Chestnut Doughnut Elmnut Filbert);
my $fruit_list = $main->Listbox();
for (@fruits) { $fruit_list -> insert('end',$_); }
$fruit_list->pack();
my $fruitprint_button = $main->Button(
-text => "print selection",
-command => sub{ printthem($fruit_list) }
)->pack;
my $nut_list = $main->Listbox(
-selectmode => 'multiple',
-exportselection => 0,
)->pack;
for (@nuts) { $nut_list -> insert('end',$_); }
my $nutprint_button = $main->Button(
-text => "print selection(s)",
-command => sub{ printthem($nut_list) }
)->pack;
my $quit_button = $main->Button(-text => "quit program",
-command => sub{exit},
)->pack();
MainLoop;
sub printthem {
my $list = shift;
my @entries = $list->curselection;
for (@entries) { print $list -> get($_),"\n";}
}
For a more extensive example of Listbox usage combined with some
perl data structure exploitation see the script at:
http://w4.lns.cornell.edu/~pvhp/ptk/etc/lb-constructor
Return to table of contents
10.13. How do I select a range of tags in a Text widget?
A question arose concerning getting a range of selections from a
Text widget. Nick Ing-Simmons'
answer mentions several possibilities including:
Keyboard Copy/Paste 'is' implemented of course...
Subj: RE: $Text->tag('ranges', 'sel') - does this work?
In <199512291957.OAA02609@ohm.nrl.navy.mil>
On Fri, 29 Dec 1995 14:57:42 -0500
Charles J Williams <chas@ohm.nrl.navy.mil> writes:
!I was writing a little tk perl today, and i decided to try to
!implement a copy/paste using the 'sel' tag
!
!I enabled exportselection, and then try to probe the select
!region with:
!
! $buffer = $text->tag('ranges', 'sel');
!
!$buffer comes back with one entry, the end of the selection.
That is to be expected - the scalar gets assigned the last element of
the list.
!I tried:
!
! @buffer = $text->tag('ranges', 'sel');
!
!same difference.
This seems to work for me:
($start,$end) = $text->tagRanges('sel');
In Perl/Tk ->tagRanges(...) is an alias for
->tag('ranges',...)
The following subroutine can also probe and print the tagRanges:
sub showsel
{
my $text = @_;
my @info = $text->tagRanges('sel');
if (@info)
{
print "start=$info[0] end=$info[1]\n"
}
}
Return to table of contents
10.14. How do I group Radiobuttons together?
Specify the -variable option on each one. Here is an example pulled
from the icon.pl demo script:
$letters = '';
my $w_frame_left_b3 = $w_frame_left->Radiobutton(
-bitmap => "\@$tk_library/demos/images/letters",
-variable => \$letters,
-value => 'full',
);
my $w_frame_left_b4 = $w_frame_left->Radiobutton(
-bitmap => "\@$tk_library/demos/images/noletters",
-variable => \$letters,
-value => 'empty',
);
Return to table of contents
10.15. How do I specify fonts?
The quick answer is to specify the font configuration option of your
widget as in:
#!/usr/local/bin/perl -w
use Tk;
$main = MainWindow->new();
$labl = $main -> Label('-text' => "Foo", '-font' => "fixed");
$labl -> pack;
MainLoop;
The long answer involves figuring out what fonts you have access to locally.
The Unix programs xlsfonts and xfontsel are useful in this
regard.
The Perl/Tk version of xfontsel was distributed as the
font_test script in the Tk build directory.
See also the later question (within this FAQ) on international fonts.
Return to table of contents
10.16. How do I get the entry in an Entry?
You want to call get on the return value of the widget itself.
Here is how it may be used in a simplified version of example 1.1 from the
Tk::UserGuide where a Button is set
up to call a sub where the call to get lies:
#!/usr/bin/perl -w
use strict;
use Tk;
my $main = MainWindow -> new();
my $entry = $main -> Entry();
$entry -> pack;
$main->Button(-text => 'Print',
-command => sub{do_print($entry)}
)->pack;
MainLoop;
sub do_print {
my ($widget) = @_;
my $entered = $widget -> get();
print "The string \"$entered\" was entered.\n";
}
Return to table of contents
10.17. How do I hide a password Entry?
Set the -show option to zero, as in this example:
$entry = $form->Entry(-textvariable => \$user_entry,
-show => 0);
Return to table of contents
10.18. How do I limit an Entry's insertion width?
[OBSOLETE; explain use of new -validatecommand with 8.0]
Nick Ing-Simmons recommends writing a new Entry widget with the
insert method appropriately overridden by one that does limit the
width. His code is avaialable as a separate package from:
http://w4.lns.cornell.edu/~pvhp/ptk/etc/LEntry-0_00.tar.gz
Now Brent Powers points out a possible problem with that approach and
recommends an insert() method as follows:
Date: Thu, 22 Aug 1996 10:32:44 -0400
From: "Brent B. Powers" <powers@ml.com>
Subject: Re: How to set max characters for Entry widget
In-reply-to: <199608211445.PAA09248@pluto>
Ummm, before we set this into the distribution or FAQ, maybe we should
make it work properly. An example: Imagine maxwidth configured to 8,
the user fills in ABCDEFGH, moves the cursor back 4 places, and types
I. The SUPER::insert call sets the string to ABCDIEFGH, which this
code then modifies to ABCDIEFG.
Hmmm, how about
sub insert {
my($w, @args) = @_;
my($max) = $w->cget(-maxwidth);
my($sval) = $w->get;
if (length($sval) >= $max) {
$w->SUPER::insert(@args);
if (length($w->get) > length($sval) {
## Reject it;
my($idx) = $w->index('insert'); # get current cursor position
$w->delete(0, 'end');
$w->insert(0, $sval);
$w->icursor($idx);
$w->bell;
} else {
$w->SUPER::insert(@args);
}
}
Of course, that still doesn't deal with the selection, but ...
To which Nick Ing-Simmons responded (Thu Aug 22 1996):
'paste' and <ButtonRelease-2> call insert method, what other selection
issues are there?
Return to table of contents
10.19. How do I obtain Menus that do not tear off?
Nick Ing-Simmons outlined a couple of ways
to achieve this result. The critical feature being the
-tearoff => 0 configuration option of the Menu.
In Nick's words:
my $mb = $parent->Menubutton(...); # The button
my $menu = $mb->Menu(-tearoff => 0); # Create a non-tearoff menu
$mb->configure(-menu => $menu); # Tell button to use it.
$mb->command(....);
Above is for clarity - you can loose $menu variable:
my $mb = $parent->Menubutton(...);
$mb->configure(-menu => $mb->Menu(-tearoff => 0));
$mb->command(....);
Return to table of contents
10.20. How do I replace the default window icon?
The following works with .BMP and .GIF files. The author
would welcome an explanation of how to use Windows .ICO files.
use Tk;
my $mw = tkinit();
$mw->idletasks;
my $icon = $mw->Photo(-file => 'myicon.gif');
$mw->iconimage($icon);
MainLoop;
A module called Tk::Icon,
available from
http://www.schmuker.de/perl/modules,
addresses this topic.
Return to table of contents
10.21. How do I prevent a window from closing when
a user clicks on the 'cross-field' in the upper-right corner?
Briefly,
sub your_exit_handler
{
# ...
}
$window->protocol('WM_DELETE_WINDOW',\&your_exit_handler);
Note that Perl/Tk builds in a null operation,
\&Tk::NoOp
, that is sometimes useful
in such re-bindings.
Return to table of contents
10.22. How do I implement 'drag-n-drop?
[An explanation will appear here as soon as one of us writes it.]
[Explain
http://www.perltk.org/articles/dnd/dnd.html,
http://www.perl.com/pub/a/2001/12/11/perltk.html,
various newsgroup
threads, and Issue 6 of
Perl Monthly.]
Return to table of contents
10.23. How do I write the contents of a text widget
to an external file?
The answer has two parts. Writing to an external file is the same
as in any Perl program:
open(FILE, ">$filename");
print FILE $content;
close FILE
What's the content of a text widget? Most simply,
$content = $text_widget->get("1.0", "end");
[Explain how it's possible to complexify this.]
Return to table of contents
10.24. How do I center a window?
[...]
Return to table of contents
10.25. How do I prevent iconification, or otherwise
manage minimization and maximization of windows?
[... explain binding to and