2017-11-17 4 views
1

Also schreibe ich eine kleine Racket-Anwendung, die eine (sehr schlecht formatierte) TXT-Datei analysiert und eine .csv-Datei ausgibt, mit der in Excel gearbeitet werden kann. Als erstes öffne ich ein kleines Fenster mit einer Schaltfläche, die einen Dateidialog öffnet, so dass der Benutzer die Datei auswählen kann, die konvertiert werden soll (genau wie jedes Programm, das einen geöffneten Dateiauswahldialog startet). Ich habe mich online umgesehen und kann dazu nichts finden. Dies wird eine native Anwendung sein, also sind die Dinge, die ich beim POST-Zugriff auf Webserver gefunden habe, nicht relevant. Wie kannst du das in Racket machen?Wie erstellt man einen Datei-Upload-Button im Racket?

Antwort

0

Die Prozeduren get-file und put-file existieren in #lang racket/gui. Beide können verwendet werden, um Dateipfadnamen von Benutzern über einen Dialog zu erhalten. get-file ist auf die Auswahl bestehender Dateien ausgerichtet, während put-file auf die Schaffung neuer Dateien ausgerichtet ist.

Betrachten Sie das folgende Beispiel, die den folgenden:

  • Es schafft ein Fenster mit einem "Select File" Button enthält.
  • Wenn auf die Schaltfläche geklickt wird, erscheint ein Dialogfeld zur Auswahl einer Datei (kann die .txt-Datei zur Konvertierung sein).
  • Sobald die Textdatei ausgewählt ist, wird ein weiterer Dialog zur Auswahl einer Datei zum Speichern der konvertierten Daten geöffnet (kann die CSV-Datei sein).

#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) 
+0

Vielen Dank !! Genau das musste ich lernen, wie das funktioniert. Ich lese jetzt mehr über Frames. Danke für die Hilfe – matzy

+0

Gern geschehen :) – assefamaru

0

Es ist nicht klar, was Sie brauchen. Wenn Sie wissen möchten, wie man mit Dateien arbeitet, siehe Abschnitt File ports, aber wenn Sie wissen müssen, wie man GUI-Objekte erstellt und verwendet, siehe Windowing. Erstellen Sie GUI-Anwendungen auf der Grundlage von GTK (die in der Racket-Implementierung verwendet werden), es ist keine triviale Aufgabe für einen neuen Benutzer. Es ist nicht meine Sache, aber ich denke, wenn Sie einige RAD (wie Lazarus für Objekt Pascal, MS Visual Studio für C#) nehmen, können Sie Ihre Aufgabe schneller und einfacher als GUI ohne Text als Text schreiben.

Verwandte Themen