- NAME
- busy — confine pointer events to a window sub-tree
- SYNOPSIS
- DESCRIPTION
- INTRODUCTION
- EXAMPLE
- OPERATIONS
- tk busy window ?option value?...
- tk busy hold window ?option value?...
- -cursor cursorName
- tk busy cget window option
- tk busy configure window ?option value?...
- tk busy forget window ?window?...
- tk busy current ?pattern?
- tk busy status window
- EVENT HANDLING
- BINDINGS
- ENTER/LEAVE EVENTS
- KEYBOARD EVENTS
- PORTABILITY
- SEE ALSO
- KEYWORDS
busy — confine pointer events to a window sub-tree
tk busy window ?options?
tk busy hold window ?options?
tk busy configure window ?option value?...
tk busy forget window ?window ?...
tk busy current ?pattern?
tk busy status window
The tk busy command provides a simple means to block pointer events from
Tk widgets, while overriding the widget's cursor with a configurable busy
cursor. Note this command does not prevent keyboard events from being sent to
the widgets made busy.
There are many times in applications where you want to temporarily restrict
what actions the user can take. For example, an application could have a
“Run”
button that when pressed causes some processing to occur. However, while the
application is busy processing, you probably don't want the user to be
able to click the
“Run”
button again. You may also want restrict the user from other tasks such as
clicking a
“Print”
button.
The tk busy command lets you make Tk widgets busy. This means that user
interactions such as button clicks, moving the mouse, typing at the keyboard,
etc. are ignored by the widget. You can set a special cursor (like a watch)
that overrides the widget's normal cursor, providing feedback that the
application (widget) is temporarily busy.
When a widget is made busy, the widget and all of its descendants will ignore
pointer events. It's easy to make an entire panel of widgets busy. You can
simply make the toplevel widget (such as
“.”)
busy. This is easier and far much more efficient than recursively traversing
the widget hierarchy, disabling each widget and re-configuring its cursor.
Often, the tk busy command can be used instead of Tk's grab
command. Unlike grab which restricts all user interactions to one
widget, with the tk busy command you can have more than one widget
active (for example, a
“Cancel”
dialog and a
“Help”
button).
You can make several widgets busy by simply making its ancestor widget busy
using the hold operation.
frame .top
button .top.button; canvas .top.canvas
pack .top.button .top.canvas
pack .top
# . . .
tk busy hold .top
update
All the widgets within .top (including .top) are now busy. Using
update insures that tk busy command will take effect before any
other user events can occur.
When the application is no longer busy processing, you can allow user
interactions again and free any resources it allocated by the forget
operation.
tk busy forget .top
The busy window has a configurable cursor. You can change the busy cursor
using the configure operation.
tk busy configure .top -cursor "watch"
Destroying the widget will also clean up any resources allocated by the tk
busy command.
The following operations are available for the tk busy command:
- tk busy window ?option value?...
-
Shortcut for tk busy hold command.
- tk busy hold window ?option value?...
-
Makes the specified window (and its descendants in the Tk window
hierarchy) appear busy. Window must be a valid path name of a Tk widget.
A transparent window is put in front of the specified window. This transparent
window is mapped the next time idle tasks are processed, and the specified
window and its descendants will be blocked from user interactions. Normally
update should be called immediately afterward to insure that the hold
operation is in effect before the application starts its processing. The
following configuration options are valid:
- -cursor cursorName
-
Specifies the cursor to be displayed when the widget is made busy.
CursorName can be in any form accepted by Tk_GetCursor. The
default cursor is wait on Windows and watch on other platforms.
- tk busy cget window option
-
Queries the tk busy command configuration options for window.
Window must be the path name of a widget previously made busy by the
hold operation. The command returns the present value of the specified
option. Option may have any of the values accepted by the
hold operation.
- tk busy configure window ?option value?...
-
Queries or modifies the tk busy command configuration options for
window. Window must be the path name of a widget previously made
busy by the hold operation. If no options are specified, a list
describing all of the available options for window (see
Tk_ConfigureInfo for information on the format of this list) is
returned. If option is specified with no value, then the command
returns a list describing the one named option (this list will be identical to
the corresponding sublist of the value returned if no option is
specified). If one or more option-value pairs are specified, then the
command modifies the given widget option(s) to have the given value(s); in
this case the command returns the empty string. Option may have any of
the values accepted by the hold operation.
Please note that the option database is referenced through window. For
example, if the widget .frame is to be made busy, the busy cursor can be
specified for it by either option command:
option add *frame.busyCursor gumby
option add *Frame.BusyCursor gumby
- tk busy forget window ?window?...
-
Releases resources allocated by the tk busy command for window,
including the transparent window. User events will again be received by
window. Resources are also released when window is destroyed.
Window must be the name of a widget specified in the hold
operation, otherwise an error is reported.
- tk busy current ?pattern?
-
Returns the pathnames of all widgets that are currently busy. If a
pattern is given, only the path names of busy widgets matching
pattern are returned.
- tk busy status window
-
Returns the status of a widget window. If window presently can not
receive user interactions, 1 is returned, otherwise 0.
The event blocking feature is implemented by creating and mapping a
transparent window that completely covers the widget. When the busy window is
mapped, it invisibly shields the widget and its hierarchy from all events that
may be sent. Like Tk widgets, busy windows have widget names in the Tk window
hierarchy. This means that you can use the bind command, to handle
events in the busy window.
tk busy hold .frame.canvas
bind .frame.canvas_Busy <Enter> { ... }
Normally the busy window is a sibling of the widget. The name of the busy
window is
“widget_Busy”
where widget is the name of the widget to be made busy. In the previous
example, the pathname of the busy window is
“.frame.canvas_Busy”.
The exception is when the widget is a toplevel widget (such as
“.”)
where the busy window can't be made a sibling. The busy window is then a child
of the widget named
“widget._Busy”
where widget is the name of the toplevel widget. In the following
example, the pathname of the busy window is
“._Busy”.
tk busy hold .
bind ._Busy <Enter> { ... }
Mapping and unmapping busy windows generates Enter/Leave events for all
widgets they cover. Please note this if you are tracking Enter/Leave events in
widgets.
When a widget is made busy, the widget is prevented from gaining the keyboard
focus by a user clicking on it by the busy window. But if the widget already had
focus, it still may receive keyboard events. The widget can also still receive
focus through keyboard traversal. To prevent this, you must move
focus to another window and make sure the focus can not go back to the widgets
made busy (e.g. but restricting focus to a cancel button).
pack [frame .frame]
pack [text .frame.text]
tk busy hold .frame
pack [button .cancel -text "Cancel" -command exit]
focus .cancel
bind .cancel <Tab> {break}
bind .cancel <Shift-Tab> {break}
update
The above example moves the focus from .frame immediately after invoking the
hold so that no keyboard events will be sent to .frame or any of
its descendants. It also makes sure it's not possible to leave button
.cancel using the keyboard.
Note that the tk busy command does not currently have any effect on OSX
when Tk is built using Aqua support.
grab
busy, keyboard events, pointer events, window
Copyright © 1993-1998 Lucent Technologies, Inc.
Copyright © 2008 Jos Decoster