User interface 使用列表框%
我目前正在尝试使用Racket图形界面工具在Racket中创建一个信息网格。唯一可用的实际表是列表框%() 要填写表格,我需要使用: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) 我已经尝试过的
(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)