所以我正在编写一个小型的Racket应用程序,它将解析(格式很差的).txt文件,并输出一个可以在Excel中使用的.csv。我要做的第一件事就是打开一个带有按钮的小窗口,打开文件对话框,以便用户可以选择要转换的文件(就像启动打开文件选择对话框的任何程序一样)。我在网上四处看了看,却找不到任何相关信息。这将是一个原生应用程序,所以我在发布到网络服务器上找到的东西并不相关。你怎么能在Racket中做到这一点?
答案 0 :(得分:0)
目前尚不清楚你需要什么。如果您想知道如何使用文件,请参阅File ports部分,但如果您需要知道如何创建和使用GUI对象,请参阅Windowing。构建基于GTK的GUI应用程序(用于球拍实现)对于newbe用户来说这不是一项微不足道的任务。这不是我的事,但我想如果你拿一些RAD(例如Lazarus用于对象pascal,MS Visual Studio for C#),你可以比没有经验的文本GUI更快更容易地完成你的任务。
答案 1 :(得分:0)
#lang racket/gui
中存在get-file
和put-file
程序。两者都可用于通过对话框从用户获取文件路径名。 get-file
用于选择现有文件,put-file
用于创建新文件。
请考虑以下示例执行以下操作:
#lang racket/gui
;; Prints file's contents line by line
(define (print-each-line input-file)
(define line (read-line input-file))
(unless (eof-object? line)
;; 'line' here represents a line of txt file's contents
;; The line can be processed/modified to any desired output, but
;; for the purposes of this example, the line will simply be
;; printed the way it is without any "processing".
(println line)
(print-each-line input-file)))
;; Convert txt to csv by printing each line of txt
;; to the csv file using print-each-line (above)
(define (convert txt csv)
(define in (open-input-file txt))
(with-output-to-file csv
(lambda () (print-each-line in)))
(close-input-port in))
;; Make a frame by instantiating the frame% class
(define frame (new frame% [label "Example"]))
;; Make a button in the frame
(new button% [parent frame]
[label "Select File"]
;; Callback procedure for a button click:
[callback
(lambda (button event)
(define txt (get-file))
(define csv (put-file))
(convert txt csv))])
;; Show the frame by calling its show method
(send frame show #t)