PS/Tk
PS/Tk provides an interface to the Tk toolkit, and is an effective tool for creating graphical interfaces.
TOC »
Examples
Several examples can be found in the git repository for this egg, as well as a detailed guide to using Tk from Scheme.
Hello World
(import pstk) (tk-start) (tk/pack (tk 'create-widget 'button 'text: "Hello" 'command: (lambda () (display "Hello world") (newline))) 'padx: 20 'pady: 20) (tk-event-loop)
Simple Dialog
(import 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))
Tips on Using PS/Tk
- By default, the program tclsh8.6 is called, but an alternative program may be provided as an optional argument to (tk-start). For a distributable application, you can bundle tclkit with your application, and call the tclkit application in tk-start.
- 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
- It is helpful to put an exception handler around your tk code to prevent orphaned shells, especially when developing your program. e.g.
(handle-exceptions exn (tk-end) ; make sure tk is closed in event of any error ; begin program (tk-start) ; rest of gui setup )
- By default, PS/Tk just prints Tcl/Tk errors to stdout. To make PS/Tk throw an exception on Tk errors, run
(tk-throw-exceptions #t)
- PS/Tk currently does not work on Windows 7 due some problem with Posix/process. It will simply hang after (tk-start "tclsh85") See http://bugs.call-cc.org/ticket/765 for a workaround (You need to add
(set! process (lambda (#!rest rest) (receive (a b c d) (apply process* rest) (values a b c))))
to your .scm file like this:
(require-extension pstk) ;; http://bugs.call-cc.org/ticket/765 ;; broken posix/process function under Windows 7 (MingW) (set! process (lambda (#!rest rest) (receive (a b c d) (apply process* rest) (values a b c)))) (tk-start "tclsh85") (tk/pack (tk 'create-widget 'button 'text: "Hello" 'command: (lambda () (display "Hello world") (newline))) 'padx: 20 'pady: 20) (tk-event-loop)
- If you want to display unicode characters then you need to add the following to pstk.scm:
(tk-init-string (string-intersperse '("package require Tk" "fconfigure stdin -encoding utf-8" "fconfigure stdout -encoding utf-8" "if {[package version tile] != \"\"} {" " package require tile" "}"
Alternatively, add the following in your script:
(tk-start) (tk-eval "fconfigure stdin -encoding ascii") (tk-eval "fconfigure stdout -encoding ascii")
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.
Repository
License
BSD 2-clause
Requirements
Requires an installation of tcltk or tclkit.
Version History
- version 1.4.1: add tk/font (T. Kurt Bond)
- version 1.4.0: exit Tk application when parent Scheme process crashes, provide an option to throw exceptions on Tcl/Tk errors
- version 1.3.1: remove legacy keyword support detection, map panedwindow to ttk/panedwindow
- version 1.3.0: set default tcl/tk runtime to tclsh8.6, Chicken 5 compatibility
- version 1.2.2: get rid of implicit dependency on letrec*-semantics in letrec call (Peter Bex)
- version 1.2.1: avoid hitting apply argument limit (Jim Ursetto)
- version 1.2: removed posix dependency from meta file (felix)
- version 1.1: working on windows as well as linux
- version 1.0: first package.