2017-06-14 4 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オブジェクトに追加しますとできるため、行55列11で

self.grid.append(row2) 

をあなたの関数functionの終わりにself.getClickでアクセスされる。

通常、2番目のエラーは、テキストファイルを開いたときに発生します。私はあなたがそう、クラスの中であるためにあなたの方法のインデントを固定self.grid.append(row2)

を欠落していた気づいた数分間、あなたのコードをいじった後

:それを閉じてみて、それが

+0

あなたはこの1つに正しかったです。 downvoteの私の謝罪。私はあなたの投稿を編集するまで私の投票を修正することはできません。たぶん彼は 'self.grid.append(row2)'を置くべき場所を指摘してから投票を更新することができます:D –

+0

@SierraMountainTech私は彼女が関数の最後にIを追加すべきだと言っていました。しかし、私は答えをより具体的に、アドバイスのおかげで更新されます:) – dwmyfriend

+0

@SierraMountainTech機能の名前は... – dwmyfriend

2

編集に役立つかどうかを確認そして、あなたのこのようなrow2 = []下のforループの後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

関連する問題