2016-10-21 3 views
0

라켓의 GUI 라이브러리에서 text-field%을 사용하여 한 줄의 텍스트 상자를 창에 추가 할 수 있습니다. 그러나,이 텍스트 상자가 정수를 입력 할 수 있도록 제한하고 싶습니다.라켓의 GUI 라이브러리에서만 숫자를 허용하는 텍스트 상자

문자를 입력 할 때마다 콜백을 삽입하여 텍스트 상자에 직접 추가 할 수 있습니다. text-field% 클래스에는 메서드 get-valueset-value이 있지만 콜백이 아닌 텍스트 상자를 프로그래밍 방식으로 수정하는 데만 사용됩니다.

또 다른 방법은 정규식에서 허용되는 문자 또는 문자열을 텍스트 상자에 전달하는 것이지만이 방법은 지원되지 않는 것입니다.

그래서, 사용자가 정수로만 입력 할 수 있도록하는 라켓에 텍스트 필드를 만드는 방법이 있습니까?

답변

1

Rosetta Code에 이미이 문제에 대한 해결책이있는 것처럼 보입니다. 텍스트 상자에서 수행 할 수있는 작업은 사용자가 입력 할 때마다 호출되는 콜백으로 설정됩니다. 그런 다음 set-value을 사용하여 원하지 않는 문자를 제거 할 수 있습니다. 그 결과 text-field% 객체 (링크에서 그것을 복용)과 같을 것이다 :

(new text-field% [label "Value"] [parent frame] [init-value "0"] 
    [callback 
     (λ (f ev) 
     (define v (send f get-value)) 
     (unless (string->number v) 
      (send f set-value (regexp-replace* #rx"[^0-9]+" v ""))))])) 
프레임이 텍스트 상자에 넣고있는 프레임이

는 말 :

(define frame (new frame% [label "Demo Frame")) 
관련 문제