[ltk-user] How is ":serve-event t" meant to be used?

edgar edgar-rft at web.de
Thu Oct 17 19:00:47 UTC 2013


Jason Miller <jason at milr.com> wrote:

> On 18:26 Wed 16 Oct     , edgar wrote:
>> 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?  

> Yes

>> 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))  

> with-ltk is designed for all the ltk-calls to go within it.  It
> dynamically binds ltk::*wish* only for its dynamic extent.  I have no
> idea how the serve-event interactis with dynamic bindings, as I don't
> use it.  But in any event, *wish* will not be bound at your call to
> create-line, so it will fail.
> 
> I would suggest that you not use with-ltk here, but instead run it
> manually: http://www.peter-herth.de/ltk/ltkdoc/node8.html
> you can pass serve-event to mainloop as well to still get that
> functionality.
> 
> so instead your code should look something like:
> (defun ltk-test ()
>  (start-wish)
>  (let ((sc (make-instance 'scrolled-canvas)))
>   (pack sc :expand 1 :fill :both)
>   (setf *canvas* (canvas sc)))
>  (mainloop :serve-event t))

Thank you very much, but:

a) your code is 99% the same code that I alredy wrote in the second
   example of my original mail

b) your code produces _exactly_ the same errors that I got with the
   code from the second example of my original mail

Please don't get me wrong: I'm really thankful for your help, but it
seems as if you haven't read the full text.

Here's the second example again now with your code and the errors:

------------------------- Start of REPL Transcript ---------------------

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 ()
            (start-wish)
            (let ((sc (make-instance 'scrolled-canvas)))
              (pack sc :expand 1 :fill :both)
              (setf *canvas* (canvas sc)))
            (mainloop :serve-event t))
LTK-TEST

LTK-TEST> (ltk-test)
; the Tk window appears on the screen
NIL

LTK-TEST> (create-line *canvas* '(10 10 20 20))
; 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)
; the Tk window disappears from the screen, but:
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 ----------------------

After (exit-wish) I can restart wish by calling (ltk-test) and it works,
except that I can't close the window from the REPL without getting the
error above, but if I close the Tk window by the window's "close" button
and then call (ltk-test) again, I get the following error:

------------------------- Start of REPL Transcript ---------------------

LTK-TEST> (ltk-test)

There is already an inferior wish.
   [Condition of type LTK::LTK-ERROR]

Backtrace:
  0: (LTK::LTK-ERROR "There is already an inferior wish.")
  1: (START-WISH)
  2: (LTK-TEST)
  3: (SB-INT:SIMPLE-EVAL-IN-LEXENV (LTK-TEST) #<NULL-LEXENV>)
  4: (EVAL (LTK-TEST))

-------------------------- End of REPL Transcript ----------------------

But there is definitely no wish process in my machine anymore:

bash$ ps ax | grep wish
 6033 pts/0    S+     0:00 grep wish

How can I stop and restart wish with ":serve-event t" from the REPL
without getting errors?

Thank you,

- edgar





More information about the ltk-user mailing list