2014-04-14 2 views
0

여러 항목 및 콤보 상자 위젯이 포함 된 프레임이 있습니다. 위젯은 프레임이 채워질 때 기본값으로 채워집니다.python ttk : 프레임의 위젯 중 적어도 하나가 사용자에 의해 업데이트되었는지 감지하는 방법은 무엇입니까?

사용자가 어떤 항목/콤보 상자 위젯을 업데이트했는지 감지하는 간단한 방법이 있는지 궁금합니다.

그렇지 않으면 모든 항목/콤보 박스 위젯을 하나씩 살펴보고 기본 위젯과 다른 경우에만 새 값을 저장해야합니다.

그렇다면 먼저 비교할 필요없이 변경된 항목의 값만 복사하여 시간을 절약 할 수 있습니다.

답변

0

나는 당신이 달성하려고하는 것을 이해하는 것이 잘 모르겠지만, 내가 생각할 수있는 두 가지 옵션은 각각의 위젯을 통해

  1. 으로 반복하고 참조 값 (에 당신이 당신의 질문에서 연상 한 비교)
  2. 해당 위젯에 대한 수정에 결합하거나 새로운 값을 저장 또는 바인딩 콜백 통해 GUI에 전을 수행하기 위해 편집 된 위젯

일반적인 방법의리스트를 처리한다. Entryttk.Combobox을 사용하는 경우 StringVartrace 바인딩을 모두 처리 할 수 ​​있습니다.

다음은 편집 된 위젯의 을 나타내는 콜백을 보여주는 스 니펫입니다 (this answer에서 영감을 얻음). 손상된 목록 (편집 된 위젯 포함) 또는 수정 된 값만있는 데이터 구조를 처리하는 것은 사용자의 책임입니다.

from Tkinter import * 
import ttk 

def callback(name, sv): 
    print "{0}: {1}".format(name, sv.get()) 

root = Tk() 

sv = StringVar() 
sv.trace("w", lambda name, index, mode, sv=sv: callback("one", sv)) 
e = Entry(root, textvariable=sv) 
e.pack() 

sv = StringVar() 
sv.trace("w", lambda name, index, mode, sv=sv: callback("two", sv)) 
e = Entry(root, textvariable=sv) 
e.pack() 

sv = StringVar() 
box = ttk.Combobox(root, textvariable=sv) 
box.pack() 
box['values'] = ('X', 'Y', 'Z') 
box.current(0) 
sv.trace("w", lambda name, index, mode, sv=sv: callback("three", sv)) 

root.mainloop()