Racket/Lille-GUI

Från Täpp-Anders
Hoppa till navigeringHoppa till sök
#lang racket/gui

;;;;;
;; Riktigt Enkelt GUI-Demo implementerad i Racket
;; Täpp-Anders Sikvall 2026-04-03 anders@sikvall.se
;;;;;

;; Skapa huvudfönstret
(define frame
  (new frame%
       [label "Racket GUI Demo"]
       [width 520]
       [height 420]))

;; Meny
(define menu-bar (new menu-bar% [parent frame]))

(define menu-file (new menu% [label "Arkiv"] [parent menu-bar]))
(new menu-item% [label "Öppna..."] [parent menu-file]
     [callback (λ (i e) (message-box "Öppna" "Filöppning simulerad"))])
(new menu-item% [label "Spara"] [parent menu-file]
     [callback (λ (i e) (message-box "Spara" "Filen sparad!"))])
(new separator-menu-item% [parent menu-file])
(new menu-item% [label "Avsluta"] [parent menu-file]
     [callback (λ (i e) (send frame show #f))])

(define menu-help (new menu% [label "Hjälp"] [parent menu-bar]))
(new menu-item% [label "Om programmet"] [parent menu-help]
     [callback (λ (i e) (message-box "Om" "Racket GUI Demo\nPedagogisk exempel"))])

;; Lite layouting av dialogen
(define main-panel
  (new vertical-panel% [parent frame] [spacing 12] [border 15]))

;; Rubrik
(new message%
     [parent main-panel]
     [label "Välkommen till Racket GUI-demo!"])

;; Input-fält, 2 st, namn och epost
(define name-field
  (new text-field% [parent main-panel] [label "Namn:"] [init-value "Anna Andersson"]))

(define email-field
  (new text-field% [parent main-panel] [label "E-post:"] [init-value "anna@example.com"]))

;; Radio buttons för att välja färg
(define color-group
  (new group-box-panel% [parent main-panel] [label "Favoritfärg"]))

(define color-radio
  (new radio-box% [parent color-group] [label #f]
       [choices '("Röd" "Grön" "Blå" "Gul")]
       [style '(vertical)]))

;; Knappar för rensa och skicka
(define btn-panel
  (new horizontal-panel% [parent main-panel] [alignment '(center center)] [spacing 20]))

(new button% [parent btn-panel] [label "Rensa"]
     [callback (λ (b e)
                 (send name-field set-value "")
                 (send email-field set-value "")
                 (send color-radio set-selection 0))])

(new button% [parent btn-panel] [label "Skicka"] [style '(border)]
     [callback (λ (b e)
                 (define name (send name-field get-value))
                 (define email (send email-field get-value))
                 (define color (list-ref '("Röd" "Grön" "Blå" "Gul")
                                         (send color-radio get-selection)))
                 (message-box "Tack!" 
                              (format "Hej ~a!\n\nE-post: ~a\nFavoritfärg: ~a" 
                                      name email color)))])

;; Centrera fönstret och starta GUI
(send frame center)
(send frame show #t)