2015-08-16 81 views
1

我想用一個for循環創建按鈕,並輸入(狀態=禁用)部件。要創建的小部件的數量將是運行時參數。我想要的是,每次點擊按鈕時,相應的條目都會啓用(state =「normal」)。在我的代碼中的問題是,我點擊的任何按鈕,它隻影響最後一個條目小部件。有沒有什麼辦法解決這一問題。?這裏是我的代碼:在你的代碼如何鏈接在for循環中創建的python tkinter小部件?

from tkinter import * 

class practice: 
    def __init__(self,root): 
     for w in range(5): 
      button=Button(root,text="submit", 
       command=lambda:self.enabling(entry1)) 
      button.grid(row=w,column=0) 
      entry1=Entry(root, state="disabled") 
      entry1.grid(row=w,column=1) 

    def enabling(self,entryy): 
     entryy.config(state="normal") 

root = Tk() 
a = practice(root) 
root.mainloop() 

回答

1

幾個問題 -

  1. 你應該讓你創建的buttons和條目,並將它們保存在一個實例變量,最有可能這將是很好的將它們存儲在列表中,那麼w將是列表中每個按鈕/條目的索引。

  2. 當你lambda: something(some_param) - 的some_param()函數值不是取代,直到當函數實際上是所謂的,在那個時候,它正在爲entry1最新值,因此這個問題。您不應該依賴於此,而應該使用functools.partial()併發送Button/Entry索引來啓用。

示例 -

from tkinter import * 
import functools 

class practice: 
    def __init__(self,root): 
     self.button_list = [] 
     self.entry_list = [] 
     for w in range(5): 
      button = Button(root,text="submit",command=functools.partial(self.enabling, idx=w)) 
      button.grid(row=w,column=0) 
      self.button_list.append(button) 
      entry1=Entry(root, state="disabled") 
      entry1.grid(row=w,column=1) 
      self.entry_list.append(entry1) 

    def enabling(self,idx): 
      self.entry_list[idx].config(state="normal") 


root = Tk() 
a = practice(root) 

root.mainloop() 
+0

哇。這解決了我的問題!謝謝! – Crstn

+0

@Crstn請注意,我說的第一點(在我的回答中)很重要。否則,你最終會陷入神祕的錯誤。 –

0

每當人們有問題,用lambda表達式,而不是DEF語句,我建議重寫與DEF語句代碼,直到它的工作原理正確創建的函數。以下是對代碼的最簡單修復:重新對窗口小部件創建進行排序,並將每個條目綁定到一個新函數作爲默認參數。

from tkinter import * 

class practice: 
    def __init__(self,root): 
     for w in range(5): 
      entry=Entry(root, state="disabled") 
      button=Button(root,text="submit", 
       command=lambda e=entry:self.enabling(e)) 
      button.grid(row=w,column=0) 
      entry.grid(row=w,column=1) 

    def enabling(self,entry): 
     entry.config(state="normal") 

root = Tk() 
a = practice(root) 
root.mainloop() 
+0

它也可以工作!謝謝! – Crstn