2012-07-11 21 views
1

在下面的代碼中,我需要返回所有返回的值(但是對於每一行分開),但我已經嘗試lambda並失敗,我再也沒有得到任何地方。回調和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

您至少有一對夫婦的選擇。首先,您可以將條目小部件存儲在字典或列表中,然後將索引傳遞給回調函數。例如:

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),並對基本數據結構(如列表和字典)有基本的瞭解,那麼像這樣的問題將不再是絆腳石。

+0

我認爲'1'需要是'我',否則行,列不工作。我只是簡單地按照'print self.box [key] .get()'的方法完成,但需要考慮在回調中刪除默認的灰色文本。 – user2063 2012-07-11 13:23:27

+0

@ user2063:你是對的。我在我的答案中解決了這個問題 – 2012-07-11 13:28:31

+0

查看已更新的代碼,我嘗試清除該框並讀取用戶插入的新值。我只設法清除盒子並打印一個空行(因爲盒子現在是空的)。我如何讓它等待或類似? – user2063 2012-07-11 13:52:13

0

對於誰是這條線

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

到谷歌的關鍵詞是「列表理解」混淆蟒蛇新手(像我一樣),這是在格式初始化列表的方式

[用於子句表達]

這相當於所述摘錄

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

換句話說,它創建初始化爲

[ StringVar, StringVar, StringVar, StringVar, ... ] 

其值設置後的列表。