2017-10-18 13 views
0
global SelectMode 
set SelectMode mode1 
set FunList {Func1 Func2 Func3} 
listbox .lb -listvariable FunList 
bind .lb <<ListboxSelect>> {puts [.lb curselection]} 
ttk::combobox .com -values {mode1 mode2 mode3} -textvariable SelectMode 
pack .lb 
pack .com 

목록 상자에서 (예를 들어 "이 Func2"를 선택) 다음 콤보 상자의 모드를 선택, 나는 예기치 않은 빈 문자열 출력 아래와 같이 얻을 :목록 상자 항목을 선택된 상태로 유지하는 방법은 무엇입니까? 내가 처음 항목을 선택하면

1 
"" (unneeded) 

방법 목록 상자 항목을 선택한 상태로 유지하고 콤보 상자에 영향을받지 않습니까? 감사합니다.

+0

FWIW,이 문제를 재현 할 수 없습니다. 아마도이 코드에없는 뭔가 다른 빈 문자열을 일으키는 것입니다. –

+0

@Peter Lewerin ehm ... Linux에서 다시 시도했지만 빈 문자열이 표시되지 않습니다. 그건 괜찮아요, 당신은 목록 상자 항목을 선택한 상태를 계속 표시에 대한 생각을 가지고, 문자열을 출력하지 않아도됩니까? – Jimmy

+0

글쎄, 엄선적으로 선택 상태 *가 목록 상자 위젯에 이미 표시되어 있지만, 지금과 같은 바인딩을 사용하지만 선택을 출력하는 대신 레이블 위젯의 텍스트를 설정하는 것은 어떻습니까? –

답변

0

.lb curselection 명령은 무엇이 선택되었는지 알기 위해 창 관리자를 중점적으로 활용합니다. 창 관리자는 다른 요소 (이 경우 콤보 상자)로 바쁘기 때문에 목록 상자에 선택 항목이 있음을 알 수 없습니다. 해결 방법은 목록 상자 선택을 추적하는 절차를 작성하는 것입니다. 선택이 변경되면 변수를 업데이트하십시오.

global SelectMode 
lb_selection = "" 
set SelectMode mode1 
set FunList {Func1 Func2 Func3} 
listbox .lb -listvariable FunList 
bind .lb <<ListboxSelect>> {ListSelectionChanged %W} 
ttk::combobox .com -values {mode1 mode2 mode3} -textvariable SelectMode 
pack .lb 
pack .com 

# Procedure bound to <<ListboxSelect>> virtual event. 
proc ListSelectionChanged { listbox } { 
    global lb_selection 
    set lb_selection [$listbox curselection] 
} 

# Procedure to repeatedly print the selection status of the listbox 
proc printLBSelection { } { 
    global lb_selection 
    puts $lb_selection 
    after 2000 printLBSelection 
} 
+0

설명 주셔서 감사합니다. 그러나 반복적으로 선택 상태를 인쇄하고 싶지는 않습니다. 목록 상자에 선택 항목이 계속 표시되도록하고 싶습니다. 귀하의 조언에 따라 printLBSelection에서 "$ listbox selection $ lb_selection set"을 추가하면 작동하는 것처럼 보이지만 "printLBSelection 2000 이후"를 사용하지 않는 다른 해결 방법이 있습니까? 감사. – Jimmy

+0

위의 @Peter Lewerin 주석이 전체적으로 찾고있는 것일 수 있습니다. 그것은 레이블이 현재 목록 상자 선택을 저장할 수 있다는 점에서 콤보 박스처럼 약간 작용할 것입니다. 전역 변수 대신 StringVar를 레이블의 텍스트 변수로 사용하고 목록 상자 값이 변경 될 때마다 레이블 변수에서 .set() 메서드를 호출하여 선택 항목을 업데이트합니다. 그런 다음 아무 것도 인쇄 할 필요가 없습니다. 대답은 UI에서 더 잘 보입니다. –

0

당신은 다른 위젯은 선택이있는 경우 변경하는 선택을 방지하기 위해 false로 exportselection 옵션을 설정할 수 있습니다.

listbox .lb -listvariable FunList -exportselection false 
+0

고마워요! 그게 내가 원하는거야! – Jimmy