Frage

Ich habe Code geschrieben, um ein Fenster Bitmap zu lesen und würde jetzt mag es mit LTK anzuzeigen. Wie kann ich ein geeignetes Objekt konstruieren? Gibt es eine solche Funktionalität in LTK? Wenn nicht, wie kann ich es tun Schnittstelle direkt an tk?

War es hilfreich?

Lösung

Es ist schon eine Weile her, seit ich LTK für alles verwendet, aber der einfachste Weg, um ein Bild mit LTK anzuzeigen ist wie folgt:

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

Leider, was Sie können standardmäßig mit dem Bild zu tun ist ziemlich begrenzt, und man kann nur gif oder ppm Bilder verwenden - aber die ppm Dateiformat sehr einfach ist, könnte man leicht ein ppm Bild von Ihrer Bitmap erstellen. Aber Sie sagen, dass Sie das angezeigte Bild manipulieren möchten, und Blick auf den Code, der das Bild-Objekt definiert:

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

Es sieht aus wie die die tatsächlichen Daten für das Bild von der Tcl / Tk-Interpreter gespeichert ist und nicht von innen zugänglich Lisp. Wenn Sie darauf zugreifen wollten würden Sie wahrscheinlich benötigen, um Ihre eigenen Funktionen mit schreiben format wünschen und sendet Wunsch .

Natürlich können Sie einfach jedes Pixel einzeln auf einer Leinwand Objekt machen könnte, aber ich glaube nicht, dass Sie eine sehr gute Leistung, das zu tun bekommen würde, wird die Leinwand-Widget ein bisschen langsam, wenn Sie versuchen, mehr zeigen als ein paar tausend verschiedene Dinge auf sie. Um es zusammenzufassen - wenn Sie nicht über egal in Echtzeit etwas zu tun, können Sie Ihre Bitmap als .ppm Bild wollte jedes Mal sparen könnte man es anzuzeigen, und dann ist es einfach laden Sie den Code oben mit - das ist die einfachste wäre. Andernfalls könnten Sie versuchen, auf die Daten zuzugreifen aus tk selbst (nachdem sie einmal als ppm Bild Laden), schließlich, wenn nichts davon funktioniert, wie Sie zu einem anderen Toolkit wechseln könnten. Die meisten der anständigen Lisp GUI-Toolkits sind für Linux, so können Sie von Glück, wenn Sie Windows verwenden.

Andere Tipps

Tk nicht natives Windows Bitmap-Dateien unterstützen. Allerdings ist die „Img“ Erweiterung und ist frei auf fast jeder Plattform verfügbar. Sie müssen die Daten nicht in lesen, können Sie das Bild direkt aus der Datei auf der Festplatte erstellen können. Im Klar Tcl / Tk Code könnte wie folgt aussehen:

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

ein wenig mehr Informationen finden Sie unter http://wiki.tcl.tk/6165 finden

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top