2012-07-11 2 views
1

아래 코드에서 반환 된 모든 값을 반환해야하지만 각 행마다 별도로 시도했지만 람다를 사용해 보았습니다. 실패 했으므로 어디에도 갈 수 없습니다.콜백 및 n 엔트리 박스 위젯이 작동하지 않습니다. Tkinter

이전에 작동했던 콜백 정의가 있으며 상자를 클릭하면 회색 글씨가 삭제되어 계속 검정으로 입력 할 수 있습니다.

가능한 경우 'numberwritten'및 'callback'을 유지하는 대신 콜백 함수 끝에 입력 상자에 값 반환을 추가하고 싶습니다. 가능합니까?

추가 된 상자의 수는 self.number_boxes와 같으며 1에서 n까지 가능합니다.

감사합니다.

업데이트 된 코드 :

self.numbers = [StringVar() for i in xrange(self.number_boxes) ] 

    for i in xrange(self.number_boxes): 
      row = (row_number +add) 
      column = self.column +i 
      key = "%d/%d" % (row,column) 
      self.clicked = ([False] * self.number_boxes) 
      self.choice_title = Label(self.frame_table, bg=self.mycolour, borderwidth=0, width=10) 
      self.choice_title.grid(row=1, column=self.column, columnspan=self.number_boxes, sticky="nsew", padx=1, pady=1) 
      self.choice_titles.append(self.choice_title) 
      self.box[key] = Entry(self.frame_table,bg='white',borderwidth=0, width=10, justify="center", fg='grey') 
      self.box[key].grid(row=row_number+add,column=self.column+i, sticky='nsew', padx=1, pady=1) 
      self.box[key].insert(0, "Value %g" % float(i+1)) 
      self.box[key].bind("<Button-1>", lambda event, key=key, index=i : self.callback(event, key, index)) 
      self.boxes.append(self.box[key]) 


def callback(self, event, key, index): 

    for not self.clicked[index]: 
     self.box[key].delete(0, END) 
     self.box[key].config(fg='black') 
     self.clicked[index] = True 

     print self.box[key].get() 

답변

1

당신은 선택의 적어도 몇 가지있다. 하나는 dict 또는 목록 목록에 항목 위젯을 저장하고 콜백에 색인을 전달할 수 있습니다. 예를 들어 :

self.box = {} 
for i in xrange(self.number_boxes): 
    row = row_number+add 
    column = self.column+i 
    key = "%d/%d" % (row,column) 
    ... 
    self.box[key] = Entry(...) 
    self.box[key].bind("<Button-1>", lambda event, key=key: self.callback(event, key)) 

중요한 것은 단지 방법 누군가가 인터넷에 당신을 제공 선택하지 않는,하지만 문제가 당신이 그것을를 해결하기 위해이 도구를 이해하는 것입니다. lambda가 작동하는 방식 (또는 functools.partial)을 익히고 목록과 dict와 같은 기본적인 데이터 구조에 대해 기본적인 지식을 익히려면이 같은 문제가 걸림돌이되는 것입니다. 구글에 대한 키워드는 '지능형리스트가'입니다

self.numbers = [StringVar() for i in xrange(self.number_boxes) ] 

이 선으로 혼동 (나 같은) 파이썬 초보자의 경우

+0

'1'은 'i'가되어야하고 그렇지 않으면 행이 필요하다고 생각합니다. 나는 단순히 'print self.box [key] .get()'을 수행했지만 콜백에서와 같이 기본 회색 텍스트를 제거하는 방법을 살펴볼 필요가있다. – user2063

+0

@ user2063 : 정확합니다. 나는 그 대답에 고정시켰다. –

+0

상자를 비우고 사용자가 삽입 한 새 값을 읽으려고 시도한 곳에서 업데이트 된 코드를 확인하십시오. 상자 만 지우고 빈 줄을 인쇄하기 만했습니다 (상자가 비었기 때문에). 기다리거나 비슷한 것을 얻으려면 어떻게해야합니까? – user2063

0

이는 형식으로 목록을 초기화하는 방법입니다

관용구 동등

[위한 절 식]

환언
self.numbers = [] 
for i in xrange(self.number_boxes) 
    self.numbers.append(StringVar()) 

그것은

그 값 이상으로 설정되어
[ StringVar, StringVar, StringVar, StringVar, ... ] 

로 초기화리스트를 생성한다.

관련 문제