如何在Racket中创建文件上传按钮?

时间:2017-11-17 23:34:58

标签: scheme lisp racket

所以我正在编写一个小型的Racket应用程序,它将解析(格式很差的).txt文件,并输出一个可以在Excel中使用的.csv。我要做的第一件事就是打开一个带有按钮的小窗口,打开文件对话框,以便用户可以选择要转换的文件(就像启动打开文件选择对话框的任何程序一样)。我在网上四处看了看,却找不到任何相关信息。这将是一个原生应用程序,所以我在发布到网络服务器上找到的东西并不相关。你怎么能在Racket中做到这一点?

2 个答案:

答案 0 :(得分:0)

目前尚不清楚你需要什么。如果您想知道如何使用文件,请参阅File ports部分,但如果您需要知道如何创建和使用GUI对象,请参阅Windowing。构建基于GTK的GUI应用程序(用于球拍实现)对于newbe用户来说这不是一项微不足道的任务。这不是我的事,但我想如果你拿一些RAD(例如Lazarus用于对象pascal,MS Visual Studio for C#),你可以比没有经验的文本GUI更快更容易地完成你的任务。

答案 1 :(得分:0)

#lang racket/gui中存在get-fileput-file程序。两者都可用于通过对话框从用户获取文件路径名。 get-file用于选择现有文件,put-file用于创建新文件。

请考虑以下示例执行以下操作:

  • 它创建一个包含"选择文件"的窗口。按钮。
  • 单击按钮时,将出现一个对话框以选择文件(可以是.txt文件进行转换)。
  • 选择文本文件后,将打开另一个对话框,选择要保存转换数据的文件(可以是.csv文件)。
#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)