Pergunta

Eu tenho escrito um código para ler um mapa de bits do windows e agora gostaria de exibi-lo com ltk.Como posso construir um objeto apropriado?Existe tal funcionalidade no ltk?Se não, como posso fazê-lo diretamente a interface para tk?

Foi útil?

Solução

Tem sido um tempo desde que eu usei LTK para qualquer coisa, mas a maneira mais simples para exibir uma imagem com LTK é como 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)))))

Infelizmente o que você pode fazer com a imagem, por padrão, é bastante limitado, e você só pode usar gif ou imagens ppm - mas o ppm formato de arquivo é muito simples, você pode criar facilmente uma ppm de imagem de bitmap.No entanto, você deseja manipular a imagem exibida, e olhando para o código que define o objecto de imagem:

(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 os dados reais para a imagem está armazenada pelo Tcl/Tk intérprete e não acessíveis a partir de dentro lisp.Se você quiser acessá-lo, você provavelmente precisará escrever suas próprias funções, utilizando formato-desejo e enviar desejo.

Claro que você pode simplesmente render-se cada pixel individualmente em um objeto canvas, mas eu não acho que você teria um desempenho muito bom, fazendo isso, a tela widget fica um pouco lento, uma vez que você está tentando exibir mais do que alguns milhares de coisas diferentes sobre ele.Então, para resumir - se você não gosta de fazer nada, em tempo real, você pode salvar o mapa de bits como um .ppm imagem a cada vez que você quisesse exibir e, em seguida, basta carregá-lo usando o código acima, o que seria o mais fácil.Caso contrário, você pode tentar acessar os dados do tk em si (depois de carregar uma vez, como um ppm de imagem), finalmente se nenhuma dessa funcionar, você pode alternar para outro kit de ferramentas.A maioria dos decente lisp GUI toolkits são para linux, então, poderá ser fora da sorte se você estiver usando o windows.

Outras dicas

Tk não oferece suporte nativo a arquivos de bitmap do windows.No entanto, "Img" extensão e está livremente disponível em cada plataforma.Você não precisa ler os dados, você pode criar a imagem diretamente a partir do arquivo no disco.Na planície tcl/tk seu código pode parecer algo como isto:

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

um pouco mais informações podem ser encontradas em http://wiki.tcl.tk/6165

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top