You are looking at historical revision 21810 of this page. It may differ significantly from its current revision.

PS/Tk

PS/Tk provides an interface to the Tk toolkit, and is an effective tool for creating graphical interfaces.

Examples

Simple Dialog

(require-extension pstk)

(define (celsius->fahrenheit item)
  (let ((number (string->number item)))
    (if (number? number)
      (+ (* number 9/5) 32)
      0.0)))

(tk-start)
(tk/wm 'title tk "Celsius to Fahrenheit")

(let* ((celsius (tk 'create-widget 'entry))
       (label (tk 'create-widget 'label))
       (button (tk 'create-widget 'button
		   'text: 'Calculate
		   'command: (lambda () 
			       (label 'configure 
				      'text: (number->string (celsius->fahrenheit (celsius 'get))))))))
  ; layout widgets in a grid
  (tk/grid celsius 'column: 2 'row: 1 'sticky: 'we 'padx: 5 'pady: 5)
  (tk/grid label 'column: 2 'row: 2 'sticky: 'we 'padx: 5 'pady: 5)
  (tk/grid button 'column: 2 'row: 3 'sticky: 'we 'padx: 5 'pady: 5)
  (tk/grid (tk 'create-widget 'label 'text: "celsius") 
	   'column: 3 'row: 1 'sticky: 'w 'padx: 5 'pady: 5)
  (tk/grid (tk 'create-widget 'label 'text: "is") 
	   'column: 1 'row: 2 'sticky: 'e 'padx: 5 'pady: 5)
  (tk/grid (tk 'create-widget 'label 'text: "fahrenheit") 
	   'column: 3 'row: 2 'sticky: 'w 'padx: 5 'pady: 5)

  (tk-event-loop))

Several examples can be found in the svn repository for this egg.

Using Tk

This section contains some simple use cases for parts of the Tk toolkit.

Simple Widgets

Button

A 'button' displays a label or image and can be clicked to invoke its command.

(tk 'create-widget 'button 
    'text: "Label" 
    'command: (lambda () "action"))

Label

A 'label' is intended to display a single line of text.

(tk 'create-widget 'label 
    'text: "Label")
Labelframe

The labelframe is a container widget, displaying a title and line around the widgets within it.

The following sequence packs a label within a label frame, which is then displayed in the top window.

(define tk (tk-start))
(define labelframe (tk 'create-widget 'labelframe 'text: "Frame"))
(tk/pack (tk 'create-widget 'label 
             'text: "around label") 
         'in: labelframe)
(tk/pack labelframe)
Scale

The scale widget displays a slider which takes a value along a range. The user can drag the slider to a desired value, and the programmer can get or set the value.

(define tk (tk-start))
(define scale (tk 'create-widget 'scale 
                              'label: "Scale widget"
                              'from: -100
                              'to: 100
                              'length: 300
                              'orient: 'horizontal
                              'showvalue: #t
                              'tickinterval: 20))
(tk/pack scale)

The value of the scale can be retrieved (as a string) using:

> (scale 'get)
"68"

The value of the scale can be set using:

> (scale 'set 39)

Decorations: Relief and Borders

An example illustrating the ranges of border/relief type.

(require-extension pstk)
(require-extension srfi-42)

(tk-start)
(tk/wm 'title tk "PS/Tk Example: Label relief")
(tk 'configure 'borderwidth: 10)

(do-ec (: relief '("raised" "sunken" "flat" "ridge" "groove" "solid"))
       (tk/pack 
         (tk 'create-widget 'label 'text: relief
             'relief: relief
             'bd: 2    ; width of the relief
             'padx: 10 ; inner padding, between label and its relief
             )
         'side: 'left 'padx: 4))

(tk-event-loop)

Running

By default, the program tclsh85 is called, but an alternative program may be provided as an optional argument to (tk-start). For example, to instead use wish84 begin the program with (tk-start "wish84").

Under windows, there is a problem with keyboard input. Currently, the fix is to show a dialog box which is dismissed by pressing 'Enter' (not clicking!) directly after starting tk.

(tk-start "wish85")
(tk/message-box 'title: "starting program" 'message: "Press ENTER" 'type: 'ok)
(tk-wm title tk "PROGRAM") 
etc

Authors

Kenneth A Dickey, Nils M Holm and Wolf-Dieter Busch created the initial versions of pstk. This port to Chicken, plus some additions, is by Peter Lane.

License

Public Domain.

Requirements

Requires an installation of tcltk.

Version History