我已编写代码来读取Windows位图,现在想用ltk显示它。 我该如何构造一个合适的对象? 在ltk中有这样的功能吗? 如果没有,我怎么能直接连接到tk呢?

===============>>#1 票数:3 已采纳

我用LTK已经有一段时间了,但用LTK显示图像的最简单方法如下:

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

不幸的是,默认情况下你可以对图像做的事情是相当有限的,你只能使用gif或ppm图像 - 但ppm文件格式非常简单,你可以轻松地从你的位图创建一个ppm图像。 但是,您说您想要操纵显示的图像,并查看定义图像对象的代码:

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

看起来图像的实际数据是由Tcl / Tk解释器存储的,不能从lisp中访问。 如果你想访问它,你可能需要使用format-wishsend-wish编写自己的函数。

当然你可以简单地在画布对象上单独渲染每个像素,但我不认为你会得到非常好的表现,一旦你试图显示超过几千种不同的东西,画布小部件就会变慢一点它。 总而言之 - 如果你不关心实时做任何事情,你可以在每次想要显示它时将你的位图保存为.ppm图像,然后只需使用上面的代码加载它 - 这将是最简单的。 否则,您可以尝试从tk本身访问数据(在将其作为ppm映像加载一次之后),最后如果这些都不起作用,您可以切换到另一个工具包。 大多数体面的lisp GUI工具包都是针对linux的,所以如果你使用的是windows,你可能会失败。

===============>>#2 票数:2

Tk本身不支持Windows位图文件。 但是,“Img”扩展功能可以在几乎所有平台上免费使用。 您不需要读取数据,可以直接从磁盘上的文件创建映像。 在简单的tcl / tk中,您的代码可能如下所示:

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

有关更多信息, 请访问http://wiki.tcl.tk/6165

  ask by Sarien translate from so

未解决问题?本站智能推荐:

1回复

如何让Ltk显示用户正在写什么以及打印什么功能?

函数的种类包括: 我已经阅读了Ltk文档,但似乎没有文本小部件用法的任何示例。
1回复

Lisp工具包(ltk):无法获得SCALE:可变值

我正在AMD64机器上使用SBCL for Linux。 功能CONTROL-TEST使一个带有绘图CANVAS和两个滑动SCALE的窗口。 滑块:UPPER-SLIDER和FORE-SLIDER的变量分别绑定到UPPER-THETA和FORE-THETA,但是更新代码只能看到0。我已经在另
2回复

ltk(常见的lisp)的问题

我使用asdf-install将ltk安装到Steel Bank Common Lisp,但我甚至无法开始使用它V_V。 下面的代码是文档中最简单的示例,几乎是逐字复制的。 这是我从sbcl得到的错误消息:
1回复

SBCL的统计分析器不显示每个被调用函数的条目

我正在使用SBCL的统计分析器来分析这些功能: 为了评估递归版本的权重,我定义了一个函数fact-call ,它在所有fact-rec调用调用之下保留在堆栈上,以便可以正确监视它。 这是我的分析代码: 继续这样做可以确保fact-rec永远不会被直接调用,所以如果它出现在探查器
3回复

我可以使用带有动态lambda列表的lambda(没有宏)吗?

我正在尝试创建一个函数来返回函数,其中包含动态生成的任意lambda列表。 我可以用宏来做,但我试图去宏 - 如果我已经得到了: 我可以用它如下: 这正是我想要的行为。 它返回一个函数,其lambda列表是动态提供的(在这种情况下, (fuel device) 。)我正在尝试
1回复

如何使用SBCL的SB-SPROF分配分析?

更新:升级到SBCL 1.0.24解决了我的问题。 (虽然我还需要将SLIME升级到11-23-2008版本。稳定的2006-04-20版本以及CVS的负责人似乎不适用于SBCL 1.0.24。) SBCL统计分析器的文档表明除了CPU使用率之外,您还可以分析内存分配。 然而,对于我的
1回复

如何使用sbcl + restas + apache运行Web应用程序?

最近,我得到了与他人一起编写Web应用程序的工作。 他们选择使用Apache,所以我必须使用它。 但是我正在使用restas在sbcl编写程序。 所以我很困惑如何在Apache后面运行我的应用程序。 我已经尝试过mod_lisp ,但是似乎没有用。 我只得到一个页面:Internal
2回复

使用hunchentoot和sbcl难以从Web捕获Lisp输入

这里有一个轻率的问题。 在过去的几个月中,我一直在慢慢学习Lisp,并且在尝试从Web浏览器获取输入与从REPL获取输入时遇到了问题。 具体问题是在尝试评估此代码时: 假设sexp是'(look north) 。 (member (car sexp) '(look walk p
1回复

SB-KERNEL:TWO-ARG - 这在调试器回溯中使用时意味着什么?

我(新手)调试我的Lisp代码(Common Lisp,Steel Bank,SLIME)。 我的回溯中的第一帧是: 我的问题是: 什么“SB-KERNEL:TWO-ARG”意味着/检查/做什么? 我自己应该在哪里上网? (我尝试搜索它但除了在其他Backtra
2回复

sbcl(和剪辑):什么时候字符不是字符? (使用defconstant)

这个问题是关于sbcl的。 问题:什么时候字符不是字符? 考虑以下代码: 如预期的那样,它将产生: 现在考虑以下代码: 它产生: 但是请考虑以下代码: 使用sbcl加载时,它会为您提供: 最初,我期望能够报告clisp对预期的返回值或可能的错误