2012-05-25 4 views
3

어떻게 든 목록 상자의 각 항목과 함께 숨겨진 ID를 저장할 수 있는지 궁금합니다. 그 이유는 데이터베이스에서 고유 한 ID (사용자에게 보이지 않지만 각 레코드를 고유하게 식별하는 데 사용)가있는 테이블을 가지고 있기 때문입니다. 메모리에있는 테이블을 캐싱하고 idtkInter 목록 상자에 숨겨진 ID

레코드 중 하나를 선택할 수있는 목록 상자를 만들고 싶습니다. 표시된 텍스트는 고유 한 ID가 아니라 고유 한 필드 (예 : '이름')이지만 고유 할 수 있지만 집행되지 않고 색인이 없습니다. 내가 가지고있는 그래서 예를 들어, :

Id Name 
-- ---- 
2 Rod 
5 Jane 
15 Freddy 

그런 다음 Jane을 선택

, 어떻게 든 쉽게 ID를 액세스 할 수있을 것 5

내 문제는 내가 고유 ID를 연결할 수있는 방법을 찾을 수 있다는 것입니다 (5)을 선택하여 (Jane) 캐시 된 레코드를 쉽게 식별 할 수 있습니다. 제어 변수를 사용할 수 있다는 것을 알고 있지만 목록의 모든 문자열 목록 만 제공합니다. 원하는 것은 아닙니다. 또한 색인 (예 : 삽입)은이 목적을 위해 신뢰할만한 것으로 보이지 않습니다.

내가 할 수 있었던 유일한 방법은 id에 이름을 매핑하는 다른 사전을 갖는 것입니다. 여러 가지 이유로, 이것은 차선책입니다.

여기에 뭔가가 있습니까? 이 작업을 수행하는 더 쉬운 방법이 있습니까?

+0

당신은 '제인'의 경우 ID가 '5'이고,로드의 경우 '2'를 의미합니까? :-P –

+0

@MartijnPieters : 예, 죄송합니다. 지금 수정했습니다. –

답변

3

색인을 동일하게 유지하는 경우 ID를 목록에 유지 한 다음 .curselection() 색인을 사용하여 다시 색인 행으로 매핑하십시오.

예에서 Jane이 목록에서 두 번째로 선택되므로 .curselection()을 선택하면 1이 반환됩니다. 같은 순서로 rowids 목록이있는 경우, rowids[1]5 될 것입니다 : 사전에서의 ROWID에 매핑 이름이 아닌

>>> rowids = [2, 5, 15] 
>>> rowids[listbox.curselection()] 
5 

약간 더 효율적입니다.

+0

감사합니다. 내가 언급하지 않은 추가 된 복잡성은 삭제/삽입을 처리해야 할 수도 있다는 것입니다. '모델'과 '뷰'사이의 관계를 관리하는 데 필요한 상당한 양의 상용구 코드가 필요하다는 생각이 점점 커지고 있습니다. 예를 들어, 삽입 할 때 정렬 할 수있는 기능이없는 것 같지만 일반적으로 컨테이너에 기능을 추가하는 데 충분한 공통 요구 사항이 있다고 생각할 수 있습니다. 어쩌면 나는 너무 많이 기대하고있어. –

+0

예, ListBox의 경우 정렬을 유지하고 인덱스와 행 ID 간의 관계를 추적 할 수있는 적절한 모델 클래스를 포함해야합니다. –

1

목록 상자 대신 ttk.Treeview 위젯을 사용하는 경우 보이지 않는 열에 ID를 저장할 수 있습니다.

+0

불행히도, 파이썬 2.6.2를 사용하고 있습니다. 트 리뷰를 지원하지 않는 것 같습니다. 이것은 큰 수치이며, 버전을 제어 할 수는 없습니다. –

관련 문제