前提・実現したいこと
ここに質問の内容を詳しく書いてください。
python3.7.4で簡易な2次元セルオートマトンを作っています。
tkinterのcreate_rectangleを用いてセルオートマトンをグラフィックで表示する機能を実装中に以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
実行すると1回は表示されるが、それ以降エラーメッセージが出てプログラムがストップする。
エラーメッセージ
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\AppData\Local\Programs\Python\Python37\lib\tkinter_init_.py", line 1705, in call
return self.func(*args)
File "C:\Users\AppData\Local\Programs\Python\Python37\lib\tkinter_init_.py", line 749, in callit
func(*args)
File "C:/Users/Dropbox/プログラミング/新しいフォルダー/ライフゲームもどき.py", line 28, in animate
outline="black", width=2)
File "C:\Users\Hiroki Aki\AppData\Local\Programs\Python\Python37\lib\tkinter_init_.py", line 2501, in create_rectangle
return self.create('rectangle', args, kw)
File "C:\Users\Hiroki Aki\AppData\Local\Programs\Python\Python37\lib\tkinter_init.py", line 2480, in _create
*(args + self._options(cnf, kw))))
_tkinter.TclError: invalid command name ".!canvas"
該当のソースコード
python
1ソースコード 2``import numpy as np 3from tkinter import* 4import time 5 6win = Tk() 7 8cv = Canvas(win, width=500, height=500) 9cv.pack() 10color=["black","blue","cyan","green","yellow","red"] 11 12max_step=100 13w=5 14h=5 15 16#ランダムで0~4までの3×3の表を作成 17a = np.random.randint(1, 5, (w, h)) 18b = np.random.randint(1, 5, (w, h)) 19 20 21def animate(): 22 #図形の描画 23 24 for i in range(1,w-1): 25 for j in range(1,h-1): 26 cv.create_rectangle( 27 i*30,j*30,i*30+29,j*30+29, 28 fill=color[b[i][j]], 29 outline="black", width=2) 30 win.after(200, animate) 31 32 33for z in range(max_step): 34 35 #範囲外の処理 36 for i in range(w): 37 a[i][0]=a[i][3] 38 for i in range(w): 39 a[i][4]=a[i][1] 40 for j in range(h): 41 a[0][j]=a[3][j] 42 for j in range(h): 43 a[4][j]=a[1][j] 44 45 #計算 46 for i in range(1,w-1): 47 for j in range(1,h-1): 48 b[i][j]=a[i-1][j-1]+a[i-1][j]+a[i][j-1]+a[i+1][j+1]+a[i+1][j-1]+a[i][j+1]+a[i][j+1]+a[i-1][j+1] 49 50 #合計の処理 51 for i in range (1,w-1): 52 for j in range(1,h-1): 53 if b[i][j]>=25 : 54 b[i][j]=5 55 elif b[i][j]>=20: 56 b[i][j]=4 57 elif b[i][j]>=15: 58 b[i][j]=3 59 elif b[i][j]>=10: 60 b[i][j]=2 61 elif b[i][j]>=5: 62 b[i][j]=1 63 64 win.after(200, animate) 65 66 #bをaに書いて次回の準備 67 for i in range(1,w-1): 68 for j in range(1,h-1): 69 a[i][j]=b[i][j] 70 71 72 win.mainloop() 73` 74 75 76### 試したこと 77過去の質問で、GUIライブラリーにおいては「イベントが何か起こったらそれに応じてしかるべき処理をする」という方針はわかり、別の関数にして、afterメソッドなど試してみたのですがどうにもうまくいきません。おそらく、きちんと理解できていないものだと思います。 78 79### 補足情報(FW/ツールのバージョンなど) 80 81ここにより詳細な情報を記載してください。