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