2015-03-30 54 views
0

我想有一個計劃,將有8×8按鈕的網格,其將在單擊改變它們的顏色 我的代碼如下所示:Python的Tkinter的:改變色彩的最近點擊按鈕

def Function(self): 
    for i in range(8): 
     for j in range(8): 
      a=Button(self,width=2,height=1,command=lambda widget="button"+str(i)+str(j):Click1(self,widget)) 
      a.grid(row=i,column=j) 

def Click1(self): 
    a["bg"]="blue" 

我有這樣的問題是,我不斷收到一個錯誤說:

NameError: name 'Click1' is not defined 

這方面的任何解決方案?

+0

不運行這個驗證它,我敢打賭,你需要寫'self.Click1(部件)'在你的命令,而不是'CLICK1(個體經營,小部件)' 。但是如果這樣可以解決這個錯誤,我敢打賭你會得到一個新的錯誤'Click1只需要1個參數(2給出)',因爲你將'self'和'widget'傳遞給一個僅僅期望'self'的函數。如果你通過在'def'中添加'widget'來解決這個問題,我敢打賭你會得到'NameError:a沒有定義'。如果你把'a'換成'widget',我敢打賭你會得到'TypeError:字符串索引必須是整數,而不是str' ...男孩,這很棘手! – Kevin 2015-03-30 20:26:32

+0

你猜對了,除了最後一個: TypeError:'str'對象不支持項目分配 – dachaver 2015-03-30 20:54:37

回答

3

您不保存對按鈕的引用,所以您以後不能再更改它們。你應該做的是保存對按鈕的引用,例如列表(如網格)列表,所以你可以使用行號和列號訪問它們。

這裏有一個工作示例:

from Tkinter import * 

class App(): 
    def __init__(self, root): 
     self.root = root 

    def Function(self): 
     self.grid = [] 
     for i in range(8): 
      row = [] 
      for j in range(8): 
       row.append(Button(self.root,width=2,height=1,command=lambda i=i, j=j: self.Click1(i, j))) 
       row[-1].grid(row=i,column=j) 
      self.grid.append(row) 

    def Click1(self, i, j): 
     self.grid[i][j]["bg"]="blue" 

root = Tk() 
app = App(root) 
app.Function() 
root.mainloop() 
+0

謝謝,這回答了我所有的問題! – dachaver 2015-03-30 22:53:52