2017-06-14 32 views
2

我有Tkinter的網格:Python的Tkinter的網格發出

from tkinter import * 

class App(): 
    def __init__(self, root): 
     self.root = root 
     self.TopFrame = Frame(root) 
     self.MiddleFrame = Frame(root) 
     self.BottomFrame = Frame(root) 
     self.TopFrame.grid(row=0) 
     self.MiddleFrame.grid(row=5) 
     self.BottomFrame.grid(row=6) 

     buttonQ = Button(self.BottomFrame, text="Quit", command=quit) 
     buttonS = Button(self.BottomFrame, text="Save", command=self.saveToFile) 
     buttonS.grid(row=0, column=0, padx=10) 
     buttonQ.grid(row=0, column=1, padx=10) 
def Function(self): 
    self.grid = [] 
    for i in range(5): 
     row = [] 
     for j in range(5): 
      row.append(Button(self.TopFrame,width=6,height=3,command=lambda i=i, j=j: self.getClick(i, j),background='gray')) 
      row[-1].grid(row=i,column=j) 
     self.grid.append(row) 
    row2 = [] 
    for k in range(4): 
     row2.append(Button(self.MiddleFrame,width=6,height=3,command=lambda i=5, k=k: self.getClick(i, k),background='gray')) 
     row2[-1].grid(row=6,column=k, pady=10) 

def getClick(self, i, j): 
    orig_color = self.grid[i][j].cget('bg') 
    if orig_color=="red": 
     self.grid[i][j]["bg"]="gray" 
    else: 
     self.grid[i][j]["bg"]="red" 

def saveToFile(self): 
    myFile=open("example.txt", 'w') 
    for line in range(5): 
     for column in range(5): 
      bg_color = self.grid[line][column].cget('bg') 
      if bg_color == "red": 
       myFile.write("1 ") 
      else: 
       myFile.write("0 ") 
     myFile.write("\n") 
    for column in range(4): 
     bg_color2 = self.grid[5][column].cget('bg') 
     if bg_color2 == "red": 
      myFile.write("1 ") 
     else: 
      myFile.write("0 ") 
    myFile.write("\n") 
    myFile.close() 
    myFile = open("example.txt",'r') 
    print(myFile.read()) 
    myFile.close() 

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

但問題是,從中間網格的按鈕不改變點擊它們的顏色並返回該錯誤:

line 1699, in __call__ 
return self.func(*args) 
line 28, in <lambda> 
    row2.append(Button(self.MiddleFrame,width=6,height=3,command=lambda i=5, k=k: self.getClick(i, k),background='gray')) 
line 32, in getClick 
    orig_color = self.grid[i][j].cget('bg') 
IndexError: list index out of range 

而且當我按下按鈕Save

line 1699, in __call__ 
return self.func(*args) 
line 39, in saveToFile 
    myFile=open("example.txt", 'w') 
PermissionError: [Errno 13] Permission denied: 'example.txt' 

我在做什麼錯?

回答

2

對於第一個錯誤,我認爲你需要添加:

self.grid.append(row2) 

在你的函數功能的端線55列11,這是因爲它添加到您的self.grid對象,並允許按鈕在self.getClick中訪問。

第二個錯誤通常發生在打開自己的文本文件時。請嘗試關閉它,看看是否有幫助

+0

你對這個是正確的。我爲歉收而道歉。但是,我無法糾正我的投票,直到您對帖子進行編輯。也許指出他應該在哪裏放置'self.grid.append(row2)'然後我可以更新我的投票:D –

+0

@SierraMountainTech我曾經說過她應該在函數Function的末尾添加I。但我會更新答案是更具體的,謝謝你的建議:) – dwmyfriend

+0

@SierraMountainTech功能的名稱是功能... – dwmyfriend

2

編輯:

與您的代碼搞亂了幾分鐘,我注意到你失蹤self.grid.append(row2)

所以固定的你的方法凹處是類的內部之後後您的row2 = []下循環這樣添加self.grid.append(row2)

row2 = [] 
for k in range(4): 
    row2.append(Button(self.MiddleFrame,width=6,height=3,command=lambda i=5, k=k: self.getClick(i, k),background='gray')) 
    row2[-1].grid(row=6,column=k, pady=10) 
self.grid.append(row2) 

工作正常了。看到這個圖像:

enter image description here