Domanda

Ho scritto il codice per leggere un bitmap di windows e ora vorrei visualizzare con ltk.Come posso costruire un oggetto appropriato?C'è la funzionalità in ltk?Se no come posso fare direttamente l'interfacciamento con tk?

È stato utile?

Soluzione

E ' stato un po da quando ho usato LTK per qualsiasi cosa, ma il modo più semplice per visualizzare un'immagine con LTK è come segue:

(defpackage #:ltk-image-example
  (:use #:cl #:ltk))

(in-package #:ltk-image-example)

(defun image-example ()
  (with-ltk ()
    (let ((image (make-image)))
      (image-load image "testimage.gif")
      (let ((canvas (make-instance 'canvas)))
        (create-image canvas 0 0 :image image)
        (configure canvas :width 800)
        (configure canvas :height 640)
        (pack canvas)))))

Purtroppo quello che si può fare con l'immagine di default è abbastanza limitato, e si può utilizzare solo in formato gif o immagini ppm - ma il ppm formato di file è molto semplice, si può facilmente creare un ppm immagine bitmap.Tuttavia, è dire che si desidera modificare l'immagine visualizzata, e guardando il codice che definisce l'oggetto immagine:

(defclass photo-image(tkobject)
  ((data :accessor data :initform nil :initarg :data)
   )
  )

(defmethod widget-path ((photo photo-image))
  (name photo))

(defmethod initialize-instance :after ((p photo-image)
                                       &key width height format grayscale data)
  (check-type data (or null string))
  (setf (name p) (create-name))
  (format-wish "image create photo ~A~@[ -width ~a~]~@[ -height ~a~]~@[ -format \"~a\"~]~@[ -grayscale~*~]~@[ -data ~s~]"
               (name p) width height format grayscale data))

(defun make-image ()
  (let* ((name (create-name))
     (i (make-instance 'photo-image :name name)))
    ;(create i)
    i))

(defgeneric image-load (p filename))
(defmethod image-load((p photo-image) filename)
  ;(format t "loading file ~a~&" filename)
  (send-wish (format nil "~A read {~A} -shrink" (name p) filename))
  p)

Sembra che i dati effettivi per l'immagine viene memorizzata dal Tcl/Tk interprete e non accessibili dall'interno di lisp.Se si voleva accesso si sarebbe probabilmente bisogno di scrivere le proprie funzioni utilizzando formato-wish e inviare desiderio.

Naturalmente, si può semplicemente eseguire il rendering di ogni pixel singolarmente su un oggetto canvas, ma non credo che si dovrebbe ottenere prestazioni molto buone che fa, la tela widget diventa un po ' lento, una volta che si sta tentando di visualizzare più di un paio di migliaia di cose diverse su di esso.Quindi, per riassumere - se non si cura di fare qualsiasi cosa in tempo reale, si potrebbe salvare il vostro bitmap come .ppm immagine ogni volta che si voleva mostrare e quindi semplicemente caricare utilizzando il codice di cui sopra - che potrebbe essere il più facile.Altrimenti si può tentare di accedere ai dati da tk stesso (dopo il caricamento di una volta come un immagine ppm), infine, se nessuna delle opere che si potrebbe passare a un altro toolkit.La maggior parte delle decente lisp GUI toolkit sono per linux, in modo che si può essere fuori di fortuna se si utilizza windows.

Altri suggerimenti

Tk non supporta in modo nativo di windows i file bitmap.Tuttavia, il "Img" estensione non è liberamente disponibile su ogni piattaforma.Non hai bisogno di leggere i dati, è possibile creare l'immagine direttamente dal file sul disco.In pianura tcl/tk tuo codice potrebbe essere simile a questo:

package require Img
set image [image create photo -file /path/to/image.bmp]
label .l -image $image
pack .l

un po ' di più informazioni possono essere trovate all' http://wiki.tcl.tk/6165

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top