________________________________________________________________________ About UITools There's been talk recently in comp.lang.python of the need for a set of "standard" composite widget classes to complement Tkinter.py. Here's my attempt to get the ball rolling. This library consists of several modules which implement various Python composite widget ("metawidget") classes. Most of these classes are derived from code which I've been using for the past year or so, but which I haven't heretofore organized. Most modules have a "principal export". That is, they define one main class along with zero or more derived/supporting classes. The principal export is usually a class named "T". This implies that these modules should be imported using "import " rather than "from import *". Classes which represent dialogs do not include "Dialog" or "Dlg" in the class names. For example, Alerts.py exports several alert dialog classes having names like Error, Warning, Question, etc; Shells.py exports classes Main, Toplevel, NonModal and Modal. I omitted the "Dialog" suffix on the grounds that it was redundant. Please let me know if you think this was a mistake. Most modules include their own unit-test code, exported as function main(). If a module is imported as a program's main module, its main() function is automatically invoked. The main() functions serve not only as rudimentary unit-tests, but also as examples of how to use the classes defined in their containing modules. For example, Menu.main() fires up a simple-minded text editor, equipped with both Pulldown and Popup menus. Here's hoping this stuff is useful. At the least, I hope it catalyzes contributions of other Python-based composite widget classes. -- Mitch Chapman mchapman@erinet.com 1 December 1996 ________________________________________________________________________ Constituent Modules Alerts.py Provides various error/warning/info dialogs. This module is inspired by the alerts.py module of the tkdialogs archive. The principal exported class, T, is a generic alert dialog. Exported subclasses include: Error -- for displaying error messages Warning -- for displaying warnings Question -- yes/no question presentation Info -- displays informational messages Instruction -- asks the user to perform a task and press "Continue" Progress -- shows the progress of some operation ButtonBox.py Provides a frame which packs buttons horizontally. Buttons can be accessed from the .buttons member dictionary, using the labels by which the buttons were initially created. (Would a simple array of buttons be easier to use?) Cursors.py Provides a means of controlling cursors on an application-wide basis. (For an example of use, see Shells.py.) KWDict.py Provides a way to construct dictionaries from keyword argument lists. Many thanks to "Internet Programming With Python," whence this code was stolen. LabelEntry.py Provides multi-column, single-column and read-only labelled entries. Menu.py Provides a convenient means of constructing pulldown and popup menus. With a single method call you can construct an entire pulldown menu, complete with cascaded submenus. Exported classes include Menubar (basically just a Tk.Frame); Item, representing a single item within a menu pane; Pulldown, representing a Menubutton and its associated menu pane; and Pane, which can serve as either the pane for a Pulldown or as a Popup. This module was inspired by, but is less capable than, the menu-creation functions in XEmacs 19.14. This module needs more work to properly support Checkbutton and Radiobutton menu items. The current version makes it hard to associate Tk variables with such menu items. ProgressBar.py Provides a status bar for displaying task completion percentages. For an example of the use of a progress bar in a dialog, see Alerts.py. Scrolled.py Provides scrollbar decorations, along with scrolled texts, canvases and lists. Exports include T, a generic scrolled-window composite class into which an arbitrary "view" widget may be inserted; Text, a scrolled text window; Canvas, a scrolled canvas window; and List, a scrolled listbox. This module was written using the Tk packer, rather than the Tk 4.1+ grid widget. (The 4.1 grid widget looked a little unreliable to me, and apparently not many people have yet installed Tk 4.2.) The scrollbars extend only to the bottom-right edge of the scrolled view, using a technique described in Welch's "Practical Programming with Tcl/Tk". (Dang! Is that the right title?) In this version, both vertical and horizontal scrollbars are displayed fulltime. I haven't yet found a way to dynamically map and unmap the scrollbars which doesn't introduce "flickering". (The scrollbar will map and unmap two or three times before settling into a visible or invisible state.) Your help is kindly requested. Shells.py Provides various top-level, non-modal and modal dialog shells, together with application-wide cursor control. Exports include Main, a subclass of Tk.Frame; Toplevel, derived from Tk.Toplevel; and NonModal and Modal dialog classes. Main and Toplevel are provided because they support application-wide cursor management. That is, when a Shells.Modal dialog is mapped, all existing Main, Toplevel and NonModal windows display a "do not enter" cursor. The dialog classes are similar to those provided by the tkdialogs archive. They differ in that they can easily be created and initialized without being displayed. So, for example, if you have a non-modal dialog which shows logged network traffic, you can create it as soon as your application starts and display it only when the user requests to see it. StdDialog.py Provides "standard" modal and non-modal dialogs, as well as button boxes populated with OK, Cancel and Help buttons. Exported classes include Controls, a composite containing a frame and a ButtonBox.T, stacked vertically; StdControls, a subclass of Controls which populates its ButtonBox.T with "OK", "Cancel" and "Help" buttons; NonModal and Modal, two dialog classes whose managed contents consist of StdControl instances. This module has a really poor design. I was trying to build a framework for "typical" dialog windows, which contain a set of controls packed into a frame, below which is a row of dialog buttons. Class Controls represents the "typical" dialog contents; StdControls represents typical contents along with typical dialog buttons; and NonModal and Modal are dialogs whose innards are StdControls. Please help me straighten this out. TkDlgWrapper.py Provides wrappers around the standard dialogs included with Tk 4.2. (NOTE: This module _requires_ Tk 4.2 or later.) The most significant exported classes include ChooseColor, an interactive color-selection dialog, and OpenFile and SaveFile, file open/save dialogs which display directory contents using folder and document icons. I originally released this module in October 1996 as "TkDialogs.py", not knowing that ftp.python.org already had a tkdialogs archive. Both this module module and the containing archive (UITools) now have names which bear no resemblance to "tkdialogs", so ending any potential name conflicts. I hope. The classes have been renamed to omit "Dlg" from the class names, but are otherwise unchanged from the original release.