BLT is a toolkit offering

  1. a set of widgets, geometry manager
  2. a set of plotting, graph drawing tools.



The toolkit is mostly written in C.

As of 2016, BLT the official version is 2.4z, which is not compatible with Tk 8.5 or 8.6 (ES 2020-02 except see the note below, on v.3.0/4.0). BLT's graphing facilities are unparalleled, and this has led at least three groups to attempt to fork some or all of BLT, and port it to Tk 8.5 or 8.6. See the section "See Also" below.

Project Website

See Also

  • The most recent functioning version of BLT, v2.4z, uses the internals of Tcl/Tk 8.4 and does not work with Tcl/Tk 8.5/8.6.
  • Development of a new version of BLT is underway in the public CVS repository, but is currently stalled.
  • For these reasons, unofficial forks of BLT have been developed, that port some of BLT's functionality to Tcl/Tk 8.5/8.6. There are at least three such forks:

(1) The RBC Toolkit: Refactored BLT Components includes the "winop" image scaling command, data vectors, and graph/barchart/stripchart widgets for developing graphing applications in Tcl/Tk

(2) TkBLT: part of the ds9 project, TkBLT is a BLT library updated for Tcl 8.6, TEA-compliant and supporting Windows and Mac.

TkBLT includes only the Graph and Barchart Tk widgets, and the Tcl Vector command.

 What:    TkBLT
 Updated: 09/2015 (v3.0)
 Contact: [email protected] (William Joye)

(3) "BLT-2.5": A massively updated BLT that works with Tcl/Tk 8.5. This is the basis for PCM's Wize project.

BLT-2.5 appears to include the whole of BLT, with some changes to the API. It does not claim to be TEA-compliant, or to work with Tcl/Tk 8.6.

 What:    (unofficial) BLT-2.5
 Where: (most up-to-date files)
    (most information)
 Updated: 03/2011 (v2.5.3)
 Contact: Peter C MacDonald [PCM]


The BLT extension can be downloaded from SourceForge at [L1 ]. You can download source code or Windows binary installers for several Tcl/Tk versions there.

You might not want to get the latest version from the BLT cvs at though. It appears, to at least LV, that the code in the CVS won't compile on machines other than X86...

Note that the URLs below are temporarily out of order. Also note that BLT 2.4v is compatible with Tcl/Tk 8.3.4, and BLT 2.4z, released in October 2002, is compatible with Tcl/Tk 8.4.

Official BLT Toolkit Distribution

 What: BLT toolkit
 Where:               ( still offline)     ( still offline)
 Description: Library of Tcl and Tk extensions.  Includes a
        a table geometry manager (table), 2D x/y chart (graph),
        barchart (bargraph),
        a new floating point value data structure (vector),
        spline computation support (spline), busy widgets (busy),
        background executation with support for dealing with stdout, stderr,
         and process status (bgexec),
        drag and drop support (drag&drop), hypertext (htext),
        read and write bitmap commands (bitmap),
        minor window manager interfaces (winop),
        and several useful debugging commands (watch and bltdebug).
        It also includes an eps canvas item which allows you to embed
         encapsulated PostScript files into the canvas.
        BLT recently included BLTlite - a Tcl only version of its library
         including the bgexec, spline, tree, vector, bltdebug, and watch
         commands.  BLTlite is automatically used when a Tcl application
         does a package require for BLT without having Tk available.
        BLT 2.4 supports Tk 8.x and has been compiled (by various people)
         on both Unix/Linux and Windows platforms.
        The blt-dev majordomo mailing list is now available for subscription
         at mailto:[email protected].  It will cover BLT development
       The sensus site has a port of the latest BLT version to Windows NT
         4.0 SP3.
        The jessikat site has compiled BLT for Win32 using VC++6.0.
        Guy Jennings mailto:[email protected] reports getting
         a useful portion of BLT 2.4a to compile on the Macintosh.
        The multimania and site files are files used to build
         RedHat rpm files.  Note that the rpm files were build using
         Tcl/Tk 8.4a1.
        The chello site has a set of patches that adds full stubs support,
         fixes blt initialization, fixes config file problems, etc.
        The neosoft .exe happens to be a version of Tcl/Tk 8.3.1 built with
         Stubs and BLT 2.4u on Windows.
        Linux RPMs can be found at the bitwalk site.
        Windows binaries can be found at the showfiles url.
        The multimania and site files are files used to build
         RedHat rpm files.  Note that the rpm files were build using
         Tcl/Tk 8.4a1.
        The chello site has a set of patches that adds full stubs support,
         fixes blt initialization, fixes config file problems, etc.
        The ProcPlace .exe happens to be a version of Tcl/Tk 8.3.1 built with
         Stubs and BLT 2.4u on Windows.
        BLT binaries for Windows can be found by searching the site .
        The above version specific URLs may very well be out of date when
         you visit from here.
        BLT 2.4z is the latest version of BLT available.
 Updated: 04/2003
 Contact: mailto:[email protected] (George A. Howlett)
        mailto:[email protected]
        mailto:[email protected] (Carl Roth)

BLT Commands overview

A table geometry manager for Tk, similar to tk's native geometry manager grid. You specify window placements as table row,column positions and windows can also span multiple rows or columns. It also has many options for setting and/or bounding window sizes.
A 2D plotting widget. Plots two variable data in a window with an optional legend and annotations. It has of several components; coordinate axes, crosshairs, a legend, and a collection of elements and tags.
A barchart widget. Plots two-variable data as rectangular bars in a window. The x-coordinate values designate the position of the bar along the x-axis, while the y-coordinate values designate the magnitude. The barchart widget has of several components; coordinate axes, crosshairs, a legend, and a collection of elements and tags.
A stripchart widget [more explanation here]
A widget displaying a general ordered tree. It is similar to [ttk::treeview] that shiped with tk since 8.5.
A tree data object
A set of widgets which can be used by their self or as part of a tab notebook, similar to ttk::notebook that ships with tk since 8.5. Also supports multi-tiered and/or scrolled tabsets. Notebook pages can be torn off into separate windows and later returned.
Creates a vector of floating point values. The vector's components can be manipulated in three ways: through a Tcl array variable, a Tcl command, or the C API. Vectors inter-operate seamlessly with the plotting widgets - changes to a vector automatically cause the graphics to redraw.
A new Tk canvas item, for handling encapsulated PostScript. Allows you to embed EPS files into a canvas displayign either the embedded preview image or a Tk image that you provide. When you print the canvas, the EPS item will automatically include the EPS file.
Computes a spline fitting a set of data points (x and y vectors) and produces a vector of the interpolated images (y-coordinates) at a given set of x-coordinates.
Like Tcl's exec command, bgexec runs a pipeline of Unix commands in the background. Unlike exec, the output of the last process is collected and a global Tcl variable is set upon its completion. bgexec can be used with tkwait to wait for Unix commands to finish while still handling expose events. Intermediate output is also available while the pipeline is active.
Creates a "busy window" which prevents user-interaction when an application is busy. The busy window also provides an easy way to have temporary busy cursors (such as a watch or hourglass).
Reads and writes bitmaps from Tcl. New X bitmaps can be defined on-the-fly from Tcl, obviating the need to copy around bitmap files. Other options query loaded X bitmap's dimensions and data.
Provides a drag-and-drop facility for Tk. Information (represented by a token window) can be dragged to and from any Tk window, including those of another Tk application. drag&drop acts as a coordinator, directing Tk send commands between (or within) TCL/Tk applications.
A simple hypertext widget. Combines text and Tk widgets into a single scroll-able window. Tcl commands can be embedded into text, which are invoked as the text is parsed. In addition, Tk widgets can be appended to the window at the current point in the text. Htext can be also used to create scrolled windows of Tk widgets.
Raise, lower, map, or, unmap any window. The raise and lower functions are useful for stacking windows above or below "busy windows".
Arranges for Tcl procedures to be called before and/or after the execution of every Tcl command. This command may be used in the logging, profiling, or tracing of Tcl code.
A simple Tcl command tracing facility useful for debugging Tcl code. Displays each Tcl command before and after substitution along its level in the interpreter on standard error.

More documentation

  • BLT is (mostly) documented in a number of HTML files that come with the distribution.
  • Dokumentation at [L2 ]
  • There is also a treasure trove of information in the presentation file slides.pdf in the Files section of the SourceForge project.
  • Look also at the tcl library files distributed with BLT. These contain some amazingly useful procs that wrap the BLT commands, and are not documented in the HTML pages or in slides.pdf. Some (but not all) of these procs are used in the demo scripts. For an example, see "Blt_ZoomStack" below.
  • [L3 ] and also covers some screenshots from the BLT example code

Printed documentation can be found in the (older):

Dead Links:

  • [L4 ] has the HTML docs online <<< Dead Link
  • DKF: I've found reasonable documentation at just by Googling. <<< Dead Link

BLT flavours

Recent versions of BLT comes in two flavours. Using BLT without Tk will lead to loading BLTlite containing commands that are useful in Tcl only:

promt> tclsh
% package require BLT
% info commands blt::*
::blt::tree ::blt::crc32 ::blt::bltdebug ::blt::bgexec ::blt::spline ::blt::vector ::blt::watch
oading Tk before loading BLT will get you the graphical parts too:
prompt> tclsh
% package require Tk
% package require BLT
% info commands blt::*
::blt::hiertable ::blt::table ::blt::hierbox ::blt::graph ::blt::vector ::blt::spline ::blt::beep ::blt::ted ::
blt::bitmap ::blt::crc32 ::blt::cutbuffer ::blt::dnd ::blt::watch ::blt::barchart ::blt::tabnotebook ::blt::tree
::blt::drag&drop ::blt::bltdebug ::blt::treeview ::blt::container ::blt::busy ::blt::tabset ::blt::stripchart ::
blt::winop ::blt::htext ::blt::bgexec

So be sure to use the correct sequence of loading the packages, just in case ... There are also versions of BLT compiled into Tcl/Tk. They are called bltwish and bltwish24.

Deployment of applications with BLT

Since BLT is not yet stubs-enabled, you can not use BLT in starkits.

  • One alternative is dqkit which is a "Batteries Included" starkit containing BLT.
  • The other alternative is FreewrapPLUS. Freewrap is a wrapper to build stand-alone executables.

The two nice projects are currently the only way for Windows and Linux to get a single-file deployment with BLT included.

The sourceforge project has a version 3.0 in the cvs which eventually will be stubs-enabled, if finished. If it can be finished, it should be very long time ahead, consider no new version has been released for the last 8 years.

For windows there are two 'unofficial' stubs-enabled versions floating around on internet: blt2.4u [L5 ] and blt2.4z [L6 ]

Platforms for BLT

BLT is available for Linux (and other X Windows based Unix systems) (as a source tar.gz, so you can compile for other unixes too) and Windows on the sourceforge page [L7 ]. Binary releases for Linux are available with certain Linux distributions (SuSE for example). There is also a release for MacOS X as part of the fink project [L8 ]. This version is for X11, not for Aqua and will only run with the Tcl/Tk version provided by fink (currently 8.4.7). The only part that currently runs with the Aqua GUI is BLTlite (version 3.0) deployed with the TclTkAquaBI distribution. Another (perhaps better supported) MacOS X version is part of MacPorts (former DarwinPorts). Also this version is for X11 but uses the newer Tcl version 8.4.16. The newest version of DarwinPorts (1.6.0), however, uses Tcl 8.5 and BLT will not build then. The workaround is to install an older port [L9 ]. See also this thread on the DarwinPorts mailing list: [L10 ]

BLT Examples

playing BLT
examples for the novice
BLT - graph - how to draw a sophisticated time axis
an example of how to set up a horizontal time axis on a graph labelled both with dates and intermediate hour markers, and with the dates centralized with respect to the hours.
BLT - graph - create a horizontal label for a vertical axis
shows how to make a horizontal label by extending one of the Y axis tick labels.
BLT - graph - Waveform Viewer
shows that the graph widget can be fast even with Big data sets.
BLT - graph - printing postscript and BLT - graph - printing from Windows
general printing issues and undocumented tricks.
BLT - graph - printing from Windows
not documented in the HTML files. This page shows different ways to print using the Windows operation system.
BLT - stripchart - with realtime update
numeric vector
dicusses one of the features of BLT giving access to fast number handling.
a command to make windows busy. This command has been extracted as a standalone packae using critcl if you need this command and nothing else.
has also been extraced to a single package.
Rotate text on a canvas
using BLT.
   How to raise and lower (graph) elements: The BLT author George Howlett explains: [].
Tclodbc + BLT
shows how to create a chart from a recordset obtained through Tclodbc
BLT data series in rows or columns
shows fixed amount of vectors vs dynamic amount of vectors
Filtering measurement values with a 1D Kalman filter
shows noisy signal with noise-filtered signal highlighted


KJN: The proc Blt_ZoomStack manages zooming for the graph widget. Add one line of code to your graphing script


and then you can zoom in by selecting areas of the graph with the mouse, and zoom back out by right-clicking. The old graph limits are stored in a stack, so you can zoom in as many times as you like, and then zoom back out through the same sequence of views.


RGM 2005-11-20:

On W2K, using BLT2.4z, I get the following error:

(bin) 6 % Blt_ZoomStack .g1
invalid command name "Blt_ZoomStack"
(bin) 7 %

Any insights? Thanks.

UK: Blt_ZoomStack sits together with other utility procs in <blt_dir>/graph.tcl

ET: I ran into this error when using an Ashok/magicsplat tclkit in a starpak I built. It turned out that the auto_index array was not getting filled and I just ended up hacking it by sourcing the file found in <blt_dir>/tclIndex found alongside graph.tcl. I had to set the global variable dir to point to <blt_dir> first.

Then Blt_ZoomStack triggers the unknown command which eventually source's graph.tcl. I first tried just sourcing graph.tcl but that just led to more errors.

Bryan Oakley 2005-06-10: I'm both amazed and disappointed in the BLT graph widgets.

Amazed, in that every time I have an idea to enhance a graph I'm working on, there seems to be an option just for that purpose (multiple axis, zooming, etc). I think it would be a wonderful addition to the core to include such a rich widget. The vector datatype is also quite useful.

Disappointed in that the documentation is incomplete. There seems to be several undocumented features; for example, the widget options -bottomvariable, -topvariable, -data, -datacommand, -barmode, and probably others. Create a stripchart and do .stripchart configure and you'll see several things that don't seem to appear in a man page.

Also, one of the examples shows that it's possible to put the legend into a separate window, but there is no documentation on that feature. That seems like a really useful feature.

Fortunately, one can read the "slides.pdf" file, read the documentation, and scour through the included demos and release notes to find enough information to get the job done.

That being said, BLT rocks. I've long been a fan of bgexec and am now a huge fan of the graph widget and vector datatype.

Other BLT related packages

 What: BLT toolkit vector addon
 Description: Patch to add ability to read binary data to BLT 2.4e and f.
 Updated: 08/1998
 Contact: mailto:[email protected] (Harald Kirsch)

 What: Win32 Tcl and Tk patches (jessikat)
 Description: A variety of patches to Tcl and Tk for Win32s.
        There are patches for wm activate bug, memory debug support,
        listbox justify, cursor, panics, and tkCanvWind.  Also on this
        page are patches and ports of a variety of extensions and
        applications such as DDE, tclStruct, BLT, otcl and a clock
        application.  Tiled widgets problematic, bgexec/busy not
        working, drag&drop ok with dde.  Also a small balloonHelp (blnhlp)
        package is available here as well.  Rotating text didn't make
        it, nor did drag and drop.  Also find a general dll
        caller for the Intel win32 platform which creates a namespace
        called dll containing the dll routines that can be called.
        Contact tested with VC++ 6.0 and Tcl 8.0.4.  It relies on the
        way MSC 4.0.  Site also has a crypt dll.
 Updated: 04/1998
 Contact: mailto:[email protected]

 What: [incr Tk] Lannet Widgets
 Description: Set of itcl widgets for various bells and whistles,
        written while programmer was working at Lannet Ltd., Israel.
        Basically PD.  Requires TkPixmap, BLT, and itcl.
        Works with tcl 7.6, should work with 8.x too. The contact does not
        support it anymore.
 Updated: 10/1998
 Contact: mailto:[email protected] (Mark Sterin)

 What: [incr Tk] table listbox widget
 Description: An itcl table widget based on the Tk Listbox.  Also includes
        checkbuttons or radiobuttons in table format.  Also requires BLT.
        Latest version supports Tk 4.0, while the older version supports
        Tk 3.4.
 Updated: 10/1998
 Contact: mailto:[email protected] (Allan Brighton)

MG 2006-06-19: I just downloaded the Windows binary of BLT for Tcl/Tk 8.4 from SourceForge. Trying to run it gives me the error "c:\windows\system32\autoexec.nt. The system file is not suitable for running MS-DOS and Microsoft Windows applications. Choose 'Close' to terminate the applciation." as though the installer was a 16-bit application. (I'm trying to run it on XP.) Anyone else had this problem, or know of a way around it?

MG, a couple of hours later - Someone has helped me track this problem down to a missing file in my XP install [L11 ], and now the BLT installer works fine. Thanks for your help in fixing it :)

As of late 2006, BLT is not a likely candidate for inclusion in ActiveTcl in the foreseeable future. One of the things that makes BLT a tough sell is it not using TEA as a framework. There may be other issues as well.

LV 2008-07-11:

I'm attempting to build BLT 3 on SPARC Solaris 2.8 using Sun's C compiler and using Tcl/Tk 8.5.3 as the base. I'm constantly running into compile problems. For instance, I finally figured out that I needed to --disable-stubs, and then, I had to edit src/bltGrElem.c and src/bltGrElem.h so they no longer made references to an anonymous union. Now I'm trying to tell BLT configure not to access the Xft libraries, etc. I tried '--without-Xft (as well as the lower case of this). configure says "WARNING: Unrecognized options: --without-Xft".

Anyone worked out this part of the maze?

YG: BLT and TCL8.5 TK8.5 is an utter mess. Someone needs to fix it properly. However, I have managed to get the CVS version as of 3 Sept 2008 to build. First, use

./configure --enable-shared --enable-symbols

as your configure line. Then hack the code in bltCoreInit.c and bltExtInit.c and change all instances of EXACT to !EXACT. Remove the #ifndef libXFT if that causes you problems. Compile -- I used icc which works fine apart from a ton of warnings and remarks pointing out the bad code within BLT. This produced something I can use in my application. This is a very dirty hack.

Hope that helps.

ejredwoodcityca 2009-11-27 10:24:35:

I have used BLT for years. Excellent package. I just got a windows 7 (64) machine. Although BLT is a 32 bit app extension, it should run. However, the setup executable is a 16 bit (available from sourceforge) will therefore will not install on w7! (Incidently, the Tcl8.4 binary distribution from sourceforge is also a 16 bit application with the same problem.)

The ActiveTcl distribution will install on windows 7, but for their own reasons, they do not provide a BLT distribution. Any ideas about where to get a 32bit installer version of BLT2.4z? Thanks.

AK Regarding ActiveTcl and BLT please note that the Refactored BLT Components are just one "teacup install rbc" away.

BRN - 2012-02-29 17:01:16:

BLT 3.0 compiled using MINGW and working for Tcl8.5.11

I have downloaded BLT3.0 source and compiled using MINGW gcc with Tcl8.5.11 libraries. It is currently working now for Tcl8.5 version.

Martyn Smith Could you let us know where you found BLT3.0 or upload somewhere your source for others to use/update ?

KJN This may be a reference to TkBLT, which is at v3.0 (see "See Also", above)

ES 2020-02 Actually, I believe it is a reference to G.A.Howlett's original "BLT toolkit" page on While most of the derivative versions of the BLT have faded into unsupported territory (RBC is at v.0.1 still), the original BLT is alive and well, and changes are being made. This page is the first place Google reports in response to "tcl blt" search, so it's important that the correct information appears here.

I have just downloaded and compiled the code:

   git clone blt-src

under Ubuntu (eoan, x86_64) and Debian 10 (buster, chromebooks, x86_64 and arm64) with only minor difficulties (a minor edit in, and a couple of typo bugs in error bar generation). Hopefully, these bugs will be corrected in the sourceforge tree before anyone reads this comment. Works under Tk 8.6.9.

Now, there are issues there. The API is changing, and many of these changes are not documented yet. With GAH's help I managed to get most of them sorted. As a part of the code tree, "private" versions of bltlsh30/bltwish30 executables get generated, that have BLT compiled in, but they are not necessary, as the package works under regular wish. By implication, the current version of the BLT code tree is v.3.0, while the README declares it to be v.4.0, so the development is proceeding. Rather than fracture the efforts and spawn off dead-end refactorings, I hope BLT itself can be stabilized.

Here are my notes:

  • edit to read "ft2_inc_spec="-I${blt_with_ft2_include_dir}/freetype ..." (not /freetype2), then
  ./configure --prefix=/usr --with-freetype2incdir=/usr/include/freetype2 ; make ; make install

This assumes libfreetype6 package is installed there, adjust as necessary for your configuration.

  • currently, import ::blt::* does not work (a conflict with "scale"), but this worked for my code:
  namespace import ::blt::graph
  namespace import ::blt::vector
  namespace import ::blt::marker
  namespace import ::blt::element
  • ZoomStack now lives in a private space, so my routine to manipulate it directly had to change (I made it universal, to work with 2.4z, 2.5 and this 3.0:
if { [catch {set BLTversion [package require BLT]}] } {
    puts stderr "BLT package is missing`\n"; exit 1 
} else {
    if { [package vsatisfies $BLTversion 3] } {set BLT3 1} else {set BLT3 0}

blt::graph $g ...
pack $g ...
Blt_ZoomStack $g

proc AddZoomStack { } {
  global BLT3 g
  if {$BLT3} {variable ::blt::Graph::_private} else {global zoomInfo}
  set cmd {}
  foreach margin { xaxis yaxis x2axis y2axis } {
    foreach axis [$g $margin use] {
      set min [$g axis cget $axis -min]; set max [$g axis cget $axis -max]
      set c [list $g axis configure $axis -min $min -max $max]
      append cmd "$c\n"
  if {$BLT3} { set _private($g,stack) [linsert $_private($g,stack) 0 $cmd]
  } else {     set zoomInfo($g,stack) [linsert $zoomInfo($g,stack) 0 $cmd] }
  • "vector create x(100)" now needs to become "vector create x -length 100", and an existing vector must be destroyed first
  • grids are now part of the axes' configuration: "grid configure -mapx x -dashes { 1 1 }" became "axis configure x -grid yes -griddashes { 1 1 }"
  • "postscript -maxpect" is not working (a bug?) and because of this the postscript generation is sub-par, does not match the appearance of the graph canvas on screen. Intriguingly, the code seems to imply that pdf and svg support is being planned. If you know how to help out with this, submit the code patches via email to GAH!

yyamasak - 2020-10-20 03:25:51

On Windows 10 + Tcl/Tk 8.6.10, rbc sometimes crashes. TkBLT doesn't support "snap -format emf".

I could get the currently best working BLT as of 2020-10-20. I use it for my 32bit application running on Windows 10. It is the original BLT 2.4z package built in alpha version of vanillawish which is a sub product of AndroWish. chw somehow made it to be loadable from Tcl/Tk 8.6.

vanillawish-14f012082f-win32.exe can be opened with 7-zip. You can find blt2.4 directory. Just extract it to Tcl/lib folder.

ET 2023-06-05


In addition to the above 32 bit windows version, you can find 64 bit versions as well as some linux ones: see Vanilla Tcl/Tk builds like... in the Release "The Flux Capacitor" (2020-11-05) section at the top (as of this writing).

I have successfully un7-zip'd the file vanillawish-78555c39f0-win64.exe - Windows (wish, 64bit) - and then added the blt2.4 folder to my windows 10 magicsplat 8.6.13 distribution's ...Apps/tcl86/lib folder.

It works quite well for me. In particular, I find I like the table widget manager as it's sort of a combination of grid and pack.