Hi all on the LTK list,
I'm trying to open a scrolled-canvas widget in the Tk main window and
then interactively drawing a line on the canvas (details in the REPL
transcripts below), but LTK is throwing nothing but errors at me.
The questions are:
1. Am I doing something fundamentally wrong in the examples below?
2. In case the errors are based on bugs in LTK, how can I help to
improve the situation?
I have some experience in both Tcl/Tk and Common Lisp. I'm a hardware
electrician and not a professional programmer, but I know how to use
diff to produce patches. But before starting to hack around in the
LTK code I would first like to hear an opinion of somebody who has
better insight than me into the LTK internals.
SBCL 1.1.12 on Debian 7.2 Wheezy (64-bit), LTK 0.98, Tcl/Tk 8.5
Here is what I'm doing:
------------------------- Start of REPL Transcript ---------------------
CL-USER> (ql:quickload :ltk)
; Loading "ltk"
(:LTK)
CL-USER> ltk:*ltk-version*
"0.98"
CL-USER> (defpackage :ltk-test (:use :cl :ltk))
#<PACKAGE "LTK-TEST">
CL-USER> (in-package :ltk-test)
#<PACKAGE "LTK-TEST">
LTK-TEST> (defparameter *canvas* nil)
*CANVAS*
LTK-TEST> (defun ltk-test ()
(with-ltk (:serve-event t)
(let ((sc (make-instance 'scrolled-canvas)))
(pack sc :expand 1 :fill :both)
(setf *canvas* (canvas sc)))))
LTK-TEST
LTK-TEST> (ltk-test)
; the Tk window appears on the screen
NIL
LTK-TEST> (create-line *canvas* '(10 10 20 20))
The value NIL is not of type STREAM.
[Condition of type TYPE-ERROR]
Backtrace:
0: (LTK::FLUSH-WISH)
1: (CREATE-LINE #<CANVAS {1004C0DC13}> (10 10 20 20))
2: (SB-INT:SIMPLE-EVAL-IN-LEXENV
(CREATE-LINE *CANVAS* (QUOTE (10 10 20 20))) #<NULL-LEXENV>)
3: (EVAL (CREATE-LINE *CANVAS* (QUOTE (10 10 20 20))))
;; Looking at the definition of FLUSH-WISH in ltk.lisp, the reason
;; for the error seems to be: (wish-stream *wish*) => NIL
LTK-TEST> *wish*
#S(LTK::LTK-CONNECTION
:STREAM NIL
:CALLBACKS #<HASH-TABLE :TEST EQUAL :COUNT 0 {1007C0E9D3}>
:AFTER-IDS #<HASH-TABLE :TEST EQUAL :COUNT 0 {1007C0EA73}>
:COUNTER 1
:AFTER-COUNTER 1
:EVENT-QUEUE NIL
:CALL-WITH-CONDITION-HANDLERS-FUNCTION
#<FUNCTION (LAMBDA # :IN MAKE-LTK-CONNECTION) {1007C0EDCB}>
:INPUT-HANDLER NIL
:REMOTEP NIL
:OUTPUT-BUFFER ("senddata [.wc.wf create line 10 10 20 20]")
:VARIABLES #<HASH-TABLE :TEST EQUAL :COUNT 0 {1007C0EE53}>)
-------------------------- End of REPL Transcript ----------------------
Here is what happens if I try to do the same thing manually:
------------------------- Start of REPL Transcript ---------------------
LTK-TEST> (start-wish)
; an empty Tk window appears on the screen
NIL
LTK-TEST> (mainloop :serve-event t)
NIL
LTK-TEST> (defparameter *scrolled-canvas* (make-instance
'scrolled-canvas)) *SCROLLED-CANVAS*
LTK-TEST> (pack *scrolled-canvas* :expand 1 :fill :both)
; the scrolled-canvas widget appears in the Tk window
#<SCROLLED-CANVAS {10040DEB83}>
LTK-TEST> (defparameter *canvas* (canvas *scrolled-canvas*))
*CANVAS*
LTK-TEST> (create-line *canvas* '(10 10 20 20))
; YIPPIE, a line appears on the canvas :-)
1
LTK-TEST> (setf *exit-mainloop* t)
; the Tk window doesn't disappear from the screen
T
LTK-TEST> (exit-wish)
attempt to THROW to a tag that does not exist:
#S(LTK::LTK-CONNECTION
:STREAM NIL
:CALLBACKS #<HASH-TABLE :TEST EQUAL :COUNT 0 {10068F9063}>
:AFTER-IDS #<HASH-TABLE :TEST EQUAL :COUNT 0 {10068F9103}>
:COUNTER 5
:AFTER-COUNTER 1
:EVENT-QUEUE NIL
:CALL-WITH-CONDITION-HANDLERS-FUNCTION #<FUNCTION FUNCALL>
:INPUT-HANDLER NIL
:REMOTEP NIL
:OUTPUT-BUFFER NIL
:VARIABLES #<HASH-TABLE
:TEST EQUAL :COUNT 0 {10068F91A3}>)
[Condition of type SB-INT:SIMPLE-CONTROL-ERROR]
Backtrace:
0: ("no debug information for frame")
1: (EXIT-WISH) [tl,external]
2: (SB-INT:SIMPLE-EVAL-IN-LEXENV (EXIT-WISH) #<NULL-LEXENV>)
3: (EVAL (EXIT-WISH))
-------------------------- End of REPL Transcript ----------------------
Looking at the definition of EXIT-WISH in ltk.lisp, the reason for
the error is the line (throw *wish* nil) but I'm not sure if the
EXIT-WISH function is meant to be called in this context at all.
The question remains:
How is ":serve-event t" meant to be used in a meaningful way?
Or am I too stupid to use LTK properly?
Thanks in advance for your answers,
- edgar