Upload
cade-downton
View
215
Download
0
Embed Size (px)
Citation preview
Tk Widgets
This material is best on several sources
– Slides by Dr. Ernest J. Friedman-Hill
– various Tcl/Tk books
Building User Interfaces With Tk
You build interfaces with
– Widget commands
buttons, labels, list boxes, text widgets, canvases, etc.
often includes callbacks
– Geometry management
widget layout tools
place, pack and grid
– Bindings
bind user actions to widgets / objects to invoke commands
– Window Manager commands
to control your window
Widgets implemented by Tk
Frame Menubutton CanvasLabel Menu ScrollbarButton Message ScaleCheckbutton Entry ListboxRadiobutton Text Toplevel
Try the Widget Tour on the PCs to get an overviewStart/Tcl/Widget Tour
The Widget Hierarchy
.
.menu.file
.scroll
.menu.help
.menu.listbox
Creating Widgets
Each widget has a class: button, listbox, scrollbar, etc.
One class command for each class, used to create instances:
button .b -text Quit -command exit
scrollbar .x -orient horizontal
class name
window name
configuration options
Configuration Options Defined by class. For buttons:
-activebackground -disabledforeground -justify -underline
-activeforeground -font -padx -width -anchor -foreground -pady -wraplength -background -height -relief-bitmap -highlightbackground -state-borderwidth -highlightcolor -takefocus-command -highlightthickness -text-cursor -image -textvariable
Default provided by class.button .b -text Hello -command exit
button .c -bitmap @$tk_library/demos/images/flagdown.bmp
grid .b .c
Advanced: may be specified in an options database
Widget Commands
Tcl command for each widget, named after widget.
Used to reconfigure, manipulate widget:button .b -text "Hello".b configure -text Goodbye
Configurations are readable and modifiable, anytime
–very powerful, as can change anything
Widget command is deleted when widget is destroyed.
–destroy .b
Geometry Management
Widgets don't control their own positions and sizes: geometry managers do.
Widgets don't even appear on the screen until managed by a geometry manager.
Geometry manager = algorithm for arranging slave windows relative to a master window.
Constraint-based systemi.e., what to do when widgets / windows change size
GeometryManager
Requested size from slave
Parameters from application designer
Geometry of master
Size and location of slave
Requested size for master
The Placer Simple but not very powerful Each slave placed individually relative to its master. Avoid using it
button .b -text X
place .b -x 0 -y 0
The Grid
Lays out objects in virtual grid of rows and columns powerful, but good for most simple placements
entry .e
.e insert 0 "Type text here"
button .b1 -text "Wow!"
button .b2 -text "Ho Hum"
grid .e -row 0 -column 0 -columnspan 2 -sticky ew
grid .b1 -row 1 -column 0
grid .b2 -row 1 -column 1
The Grid
Another example
label .to_label -text "To:"
entry .to
label .from_label -text "From:"
entry .from
text .t -width 24 -height 10
grid .to_label -row 0 -column 0 -sticky e
grid .to -row 0 -column 1 -sticky ew
grid .from_label -row 1 -column 0 -sticky e
grid .from -row 1 -column 1 -sticky ew
grid .t -row 2 -column 0 -columnspan 2 -sticky nsew
The Packer
More powerful than the placer, but more complex Arranges groups of slaves together (packing list). Packs slaves around edges of master's cavity. For each slave, in order:
1. Pick side of cavity.
2. Slice off parcelfor slave.
4. Position slavein parcel.
3. Optionally grow slaveto fill parcel.
The Packer: Choosing Sides
button .ok -text OKbutton .cancel -text Cancelbutton .help -text Help
pack .ok .cancel .help -side left
.cancel configure -text "Cancel Command"
pack .ok .cancel .help -side top
The Packer: Padding
pack .ok .cancel .help -side left \-padx 2m -pady 1m
pack .ok .cancel .help -side left \-ipadx 2m -ipady 1m
pack .ok .cancel .help -side left \-padx 2m -pady 1m -ipadx 2m -ipady 1m
The Packer: Filling
Stretch widgets to fill parcels:
pack .ok .cancel .help -side top
pack .ok .cancel .help -side top -fill x
The Packer: Filling, cont'd
pack .menu -side toppack .scrollbar -side rightpack .listbox
pack .menu -side top -fill xpack .scrollbar -side right -fill ypack .listbox
The Packer: Expansion
Increase parcel size to absorb extra space in master:
pack .ok .cancel .help -side left
pack .ok .cancel -side leftpack .help -side left \ -expand true -fill x
pack .ok .cancel -side leftpack .help -side left -expand true
The Packer: Expansion, cont'd
pack .ok .cancel .help -side left \ -expand true
pack .ok .cancel .help -side left \ -expand 1 -fill both
Hierarchical Packing
Use additional frames to create more complex arrangements:frame .leftpack .left -side left -padx 3m -pady 3mframe .rightpack .right -side right -padx 3m -pady 3m
foreach size {8 10 12 18 24} { radiobutton .pts$size -variable pts \ -value $size -text "$size points"}pack .pts8 .pts10 .pts12 .pts18 .pts24 \ -in .left -side top -anchor w
checkbutton .bold -text Bold \ -variable boldcheckbutton .italic -text Italic \ -variable italiccheckbutton .underline -text Underline \ -variable underlinepack .bold .italic .underline \ -in .right -side top -anchor w
Callbacks How to make widgets work together with application,
other widgets? Tcl scripts. Widget actions are Tcl commands:
button .a.b -command exit
exitbutton release
Bindings
Associate Tcl scripts with user events:
bind .e <Control-h> {backspace .t}
Window(s) Event Script
Bindings: Specifying Events
Specifying events:
<Double-Control-ButtonPress-1>
<3>
<KeyPress>
a
Modifiers Event Type
Button or Keysym
Bindings: Substitutions
% substitutions in binding scripts:
– Coordinates from event: %x and %y.
– Window: %W.
– Character from event: %A.
– Many more... Examples:
bind .c <B1-Motion> {move %x %y}
bind .t <KeyPress> {insert %A}
Example: Context sensitive help
button .b -text "Hello World" -command exit
button .c -text "Lazy Boy"
label .help
pack .b .c .help -side top
bind .b <Enter> {.help configure -text "Press to exit"}
bind .c <Enter> {.help configure -text "i do nothing"}
bind Button <Leave> {.help configure -text ""}
Access To Other Facilities
Keyboard focus:focus .x.y
Communication with window manager:wm title . "Editing main.c"wm geometry . 300x200wm iconify .
Deleting windows:destroy .x
Summary
Creating interfaces with Tk is easy:– Create widgets.– Arrange with geometry managers.– Bind if necessary (rarely need to, except for text and
canvas objects)– window management