User interface 使用列表框%

User interface 使用列表框%,user-interface,listbox,scheme,racket,User Interface,Listbox,Scheme,Racket,我目前正在尝试使用Racket图形界面工具在Racket中创建一个信息网格。唯一可用的实际表是列表框%() 要填写表格,我需要使用: (send a-list-box set choices ...) → void? choices : (listof label-string?) 选项列表是每列的列表。问题是我的共谋数量是可变的。我当前的数据格式类似于(列表(列表1 2 3)(列表4 5 6))。 目标是执行此命令:(发送表集(列表1 2 3)(列表4 5 6) 我已经尝试过的

我目前正在尝试使用Racket图形界面工具在Racket中创建一个信息网格。唯一可用的实际表是列表框%()

要填写表格,我需要使用:

 (send a-list-box set choices ...) → void?
      choices : (listof label-string?)
选项列表是每列的列表。问题是我的共谋数量是可变的。我当前的数据格式类似于
(列表(列表1 2 3)(列表4 5 6))
目标是执行此命令:
(发送表集(列表1 2 3)(列表4 5 6)

我已经尝试过的

我做了一个函数,它给我这个输出:
“(列表1 2 3)(列表4 5 6)”
想法是使用以下命令执行此字符串命令:

(发送表格集(eval(使用输入字符串调用)(列表1 2 3)(列表4 5 6))读取)

我也试过:

(eval(使用输入字符串调用)(发送表集(列表1 2 3)(列表4 5 6))“读取)
但这给了我一个错误
表:未定义;
无法在标识符定义之前引用标识符

如果您没有发现问题,但现在可以使用内置GUI以其他方式在racket中显示数据网格,请共享。谢谢

测试代码

`#lang racket
(require racket/gui/base)

(define frame (new frame% 
                  [label "myTable"]
                  [width 800]
                  [height 600]
                  ))

(define table (new list-box%
                 [parent frame]
                 [choices (list )]
                 [label "Test"]
                 [style (list 'single 'column-headers 'variable-columns)]
                 [columns (list "C1" "C2" "C3")]))

(define data (list (list "1" "2" "3")
                   (list "4" "5" "6")
                   (list "6" "8" "9")))


(send table set (list-ref data 0) (list-ref data 1) (list-ref data 2));--> Works but needs to be aple to handle variable lengtho of data
;(apply send table set data) ;--> ERROR: send: bad syntax

;(map (lambda (element)
;             (send table set element)) ;--> ERROR: set in list-box%: column count doesn't match argument count  column count: 3  argument count: 1
;     data)

(send frame show #t)`
如果用这种方式定义变量,如果调用

(send your-listbox-var set  (list 1 2 3)  (list 1 2 3))
在定义了variabele之后,它将起作用。

尝试以下方法:

(define data '((1 2 3) (4 5 6)))
(apply send table set data) ; same as (send table set '(1 2 3) '(4 5 6))
当输入参数到达未知大小的列表,并且过程接受可变数量的参数时使用。举个简单的例子:

(define data '(1 2 3))
(apply + data) ; same as (+ 1 2 3)
=> 6
您可以想象,
apply
“删除”其最后一个参数周围的额外括号,因此:
(apply+”(1 2 3))
变为:
(+1 2 3)

更新

考虑到
send
是一个宏,而不是我错误地假设的一个过程,上述方法将不起作用。我提出了一个我并不自豪的解决方案,使用
eval
(即)和列表拼接-我希望有人能建议一个更干净的解决方案,但这会起作用:

(define-namespace-anchor a)
(define ns (namespace-anchor->namespace a))
(eval `(send table set ,@'data) ns)
看起来这就是你想要的

(send/apply table set data)

问题是在我的代码中,我将数据获取为
(定义数据(列表(列表1 2 3)(列表1 2 3))
,如果我执行
(发送表格集数据)
它将不起作用。我需要从数据变量中获取所有列表,但找不到方法。您必须单独发送列表。在您的情况下,'(发送表格集(汽车数据)(cadr数据))'不起作用。send出现错误语法。我在测试可能解决方案的第一篇文章中添加了一段测试文件代码。apply似乎是个好主意,所以我会尝试修复错误。发生这种情况是因为
send
不是一个过程,而是一个宏。然后
apply
将不起作用,必须在其位置使用宏好的,所以我需要编写自己的宏来执行此操作?此宏应该做什么?从未这样做过,因此我将开始阅读文档。感谢您的麻烦。目前我使用一个大的
cond
开关手动执行
(发送…)
对于不大于10的列表。不是很漂亮,也不是很好的代码,但暂时可以使用。@Timbo925我使用
eval
找到了一个解决方法。请参阅我的更新答案。
(send/apply table set data)