2017-09-14 2 views
1

ich für ein kleines GUI-Programm folgenden Code verwenden:GUI-Komponente Layout in Schläger-/Scheme

#lang racket/gui 

(define ff (new frame% 
       [label "Adjust widths"] 
       [height 100] 
       [width 300])) 
(new message% [parent ff][label "testing"]) 
(new text-field% [parent ff][label "tf1"]) 
(new text-field% [parent ff][label "tf2- a long prompt"]) 
(new text-field% [parent ff][label "tf3    "]) 
(new text-field% [parent ff][label "tf4    "]) 
(send ff show #t) 

Allerdings habe ich nicht in der Lage bin gewünschtes Layout zu erhalten: enter image description here

Wie kann ich oben erhalten Layout. Ich sehe text-field und andere Komponenten haben minimale Breite und dehnbare Breite. Was ist, wenn diese Standardwerte sind und was tatsächlich ist, ist mir nicht klar. Wie kann ich die Breite von text-field fixieren? Soll ich dafür das table-panel Paket verwenden? Danke für Ihre Hilfe.

Edit: Ich habe https://docs.racket-lang.org/gui/windowing-overview.html?q=gui und auch versucht, verschiedene Optionen wie [min-width 50] und [stretchable width #f] aber anscheinend ist es nicht möglich, die Größe von Text-Feld auf einen bestimmten Wert zu beheben.

Antwort

1

Eine Möglichkeit besteht darin, zuerst die Etiketten auf die maximale Breite einzustellen und sie dann auf die gewünschte Bezeichnung zu ändern. Das funktioniert zumindest für mich.

#lang racket/gui 

(define ff (new frame% 
       [label "Adjust widths"] 
       [height 100] 
       [width 300])) 
(new message% [parent ff][label "testing"]) 
(define strings 
    '("tf1" "tf2- a long prompt" "tf3" "tf4")) 
(define str-max (argmax string-length strings)) 
(define txt-fields 
    (for/list ([str (in-list strings)]) 
    (new text-field% [parent ff] [label str-max]))) 

(for ([tf (in-list txt-fields)] 
     [str (in-list strings)]) 
    (send tf set-label str)) 

(send ff show #t) 

enter image description here

Da Schriftarten nicht eine feste Breite haben, können Sie Unterstrichen für die Zeichenfolge mit einer maximalen Länge verwenden. Eine andere Möglichkeit ist es, die Beschriftung des Textfelds komplett zu entfernen, indem Sie #f als Argument übergeben und Ihre eigene mit einer message% erstellen, für die Sie tatsächlich die Breite mit min-width steuern können. Möglicherweise müssen Sie die Nachricht und das Textfeld in eine horizontal-panel% setzen.

+0

Gut 2 Methoden, um das Problem zu lösen. – rnso