Pregunta

He escrito código para leer un mapa de bits de Windows y ahora me gustaría mostrarlo con ltk.¿Cómo puedo construir un objeto apropiado?¿Existe tal funcionalidad en ltk?Si no, ¿cómo puedo hacerlo directamente interactuando con tk?

¿Fue útil?

Solución

Ha pasado un tiempo desde que usé LTK para algo, pero la forma más sencilla de mostrar una imagen con LTK es la siguiente:

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

Desafortunadamente, lo que puedes hacer con la imagen de forma predeterminada es bastante limitado y sólo puedes usar imágenes gif o ppm, pero formato de archivo ppm es muy simple, puedes crear fácilmente una imagen ppm a partir de tu mapa de bits.Independientemente de cómo diga que desea manipular la imagen mostrada y observe el código que define el objeto de imagen:

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

Parece que los datos reales de la imagen los almacena el intérprete Tcl/Tk y no se puede acceder a ellos desde Lisp.Si quisieras acceder a él, probablemente necesitarías escribir tus propias funciones usando deseo-formato y enviar-deseo.

Por supuesto, podrías simplemente renderizar cada píxel individualmente en un objeto de lienzo, pero no creo que obtengas un rendimiento muy bueno al hacerlo, el widget de lienzo se vuelve un poco lento una vez que intentas mostrar más de unos pocos miles de cosas diferentes en él.Entonces, para resumir, si no le interesa hacer nada en tiempo real, puede guardar su mapa de bits como una imagen .ppm cada vez que desee mostrarlo y luego simplemente cargarlo usando el código anterior; eso sería lo más fácil.De lo contrario, podría intentar acceder a los datos desde el propio tk (después de cargarlos una vez como una imagen ppm); finalmente, si nada de eso funciona, podría cambiar a otro kit de herramientas.La mayoría de los kits de herramientas GUI de lisp decentes son para Linux, por lo que es posible que no tengas suerte si usas Windows.

Otros consejos

Tk no admite de forma nativa archivos de mapa de bits de Windows.Sin embargo, la extensión "Img" está disponible gratuitamente en casi todas las plataformas.No es necesario leer los datos, puede crear la imagen directamente desde el archivo en el disco.En tcl/tk simple, su código podría verse así:

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

un poco más de información se puede encontrar en http://wiki.tcl.tk/6165

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top