2016-09-16 2 views
1

나는 사용자가 자신이 좋아하는 과일을 선택할 수 있도록 목록 상자를 만들기위한 TclTk 예제를 따라했습니다 (아래 코드 참조). 이 예제는 사용자의 선택을 인쇄하고 그 것이다. 그러나, 필자는 나중에 스크립트에서 다양한 것을하기를 원합니다 (플롯 제목, 파일 이름 등에서 사용하십시오). TclTk GUI에서 사용자의 선택을 내 스크립트의 나머지 부분으로 되돌리려면 어떻게해야합니까?R에서 TclTk GUI에서 변수를 반환

library(tcltk2) 

win1 <- tktoplevel() 
win1$env$lst <- tk2listbox(win1, height = 4, selectmode = "single") 
tkgrid(tk2label(win1, text = "What's your favorite fruit?", justify = "left"), 
padx = 10, pady =c(15, 5), sticky = "w") 
tkgrid(win1$env$lst, padx = 10, pady = c(5, 10)) 
fruits <- c("Apple", "Orange", "Banana", "Pear", "Apricot") 
for (fruit in fruits) 
    tkinsert(win1$env$lst, "end", fruit) 
# Default fruit is Banana. Indexing starts at zero. 
tkselection.set(win1$env$lst, 2) 

onOK <- function() { 
    fruitChoice <- fruits[as.numeric(tkcurselection(win1$env$lst)) + 1] 
    tkdestroy(win1) 
    msg <- paste0("Good choice! ", fruitChoice, "s are delicious!") 
    tkmessageBox(message = msg) 
} 
win1$env$butOK <-tk2button(win1, text = "OK", width = -6, command = onOK) 
tkgrid(win1$env$butOK, padx = 10, pady = c(5, 15)) 
+4

누군가가 R에서 TclTk로 무언가를 만들고 있다는 것에 정말로 흥분하는 동안 [재현 가능한 예]를 주어야합니다 (http://stackoverflow.com/questions/5963269/how-to-make-a-great). -r-reproducible-example), 또는 적어도 지금까지 얻은 것과 패키지를 사용하고 있는지 확인하십시오. – alistaire

+0

사과드립니다. 나는 내가 따라간 예제에 대한 코드를 추가했다. – jim616

답변

0

목록 상자에서 사용할 수있는 명령 매개 변수가 있습니다 (만들 때 사용한 패키지를 알아야 함). 예를 들어 "-selectioncommand"매개 변수가 있습니다. 네임 스페이스 변수를 설정하여 선택한 값에 액세스 할 수 있습니다.

예 : -selectioncommand {set :: xyz :: test} 위젯을 만드는 동안이 옵션을 사용해야합니다.

+0

감사합니다. 내가 사용했던 예제 코드를 추가했습니다. 어디에서 selectioncommand 매개 변수를 사용합니까? – jim616

+0

그게 tcl일까요? 나는이 형식에 익숙하지 않다. 목록 상자를 만들 때 -> win1 $ env $ lst <- tk2listbox (win1, height = 4, selectmode = "single")를 사용 해보자. –

+0

R에 대한 tcltk listbox 검색하기. 내가 제안한 선택 명령을 사용하는 방법이 확실하지 않습니다. 나는 위의 예제의 형식이나 tcltk에 전념하지 않았습니다. tcltk에 더 적합한 형식이 있습니까? – jim616

0

사용자의 선택을 TclTk GUI에서 나머지 스크립트로 되돌리려면 어떻게해야합니까? 당신은 더 이상 GUI가 필요하지 않은 경우

당신이 R 변수의 GUI에서 선택한 설정을 추출하고 그것을 파괴 :

이것은 당신이

옵션 1을 수행하려는 작업에 따라 달라집니다. 이것은 정확히 onOK "이벤트 처리기"기능에서 수행하는 작업입니다.

당신은 전에 폐쇄 될 tcltk 창 기다릴 다음 R 명령을 추가해야이 선 후 R 코드의 실행을 계속 : (

# Wait for the window to be closed 
tkwait.window(win1) 

그런 다음 R 변수의 값을 사용할 수 있습니다 이벤트 핸들러 함수의 GUI 설정에서 채워짐)를 비즈니스 로직에 적용합니다. e. 지.

choice <- tkmessageBox(message=paste("Do you want to buy", fruitChoice, "now?"), type = "yesno", icon="question") 

옵션 2 :

귀하의 비즈니스 로직 (창을 닫지/파괴하지 않고) 이벤트 핸들러 함수에서 (실행) 트리거 방식입니다

에 코드의 끝 부분에서 비즈니스 로직 코드를 추가하여 비즈니스 논리의 출력 ("상태 변경")을 시각화합니다.

이 GUI 기반 패러다임에서는 tkdestroy을 호출하지 않고 직접 비즈니스 논리 코드를 이벤트 처리기 함수에 추가합니다.

"종료", "닫기", "취소"... 버튼을 추가하면 창을 닫을 수 있습니다. 이 버튼의 이벤트 핸들러 함수에서 tkdestroy을 호출합니다.

관련 문제