質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

981閲覧

画像更新処理のエラー

moheo

総合スコア4

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/11/10 00:25

編集2022/01/12 10:55

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
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ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/11/10 00:44

markdownにミスがあり,該当のソースコードが読み取れないので修正をお願いします.
y_waiwai

2019/11/10 00:49

このままではコードが読めないので、質問を編集し、<code>ボタン、出てくる’’’の枠の中にコードを貼りつけてください
coco_bauer

2019/11/10 01:09

「tkinter.TclError: invalid command name ".!canvas"」というエラーメッセージが出るとの事ですが、 質問に書かれたコードの中で"Canvas"という文字列が使われているのは「cv = Canvas(win, width=500, height=500)」の行だけです。 この行から「tkinter.TclError: invalid command name ".!canvas"」というエラーが発生するとは考えにくいので、質問にかかれたコード以外に作った・使っているプログラムがあるのではないでしょうか? もし、そういうプログラムがあるのなら質問に追加してください。エラーが発生しているコードが無いと、検討のしようもありませんから。
Q71

2019/11/10 01:32

スタックトレースから、エラーは次のところで発生しているようです。 cv.create_rectangle( i*30,j*30,i*30+29,j*30+29, fill=color[b[i][j]], outline="black", width=2) 引数を確認しましょう。
moheo

2019/11/13 14:13

引数は特に問題はなさそうなのですが、どうもfillが問題のようです。 fillをコメントにして動かすと普通に動きます。 for文でこんな風に描画を回すとだめなんでしょうか。
guest

回答1

0

まず、あなたもコメントをつけたということは、ソースコードがどのように表示されているかも見たはずです。Pythonは、インデントが重要な言語です。インデントが崩れた今の状態を読み解くのは、簡単ではありません。
「引数は特に問題はなさそう」とのことですが、でも、「fill=~」という引数を無しにすると、動くのですね?では、引数に問題があるのではないですか?
「for分でこんな風に」とは、どんな風ですか。

cv.create_rectangle( i*30,j*30,i*30+29,j*30+29, fill=color[b[i][j]], outline="black", width=2)

fillの引数は文字列のようです。
The Tkinter Canvas Widget

fill=

Fill color. An empty string means transparent.

fillに充てているcolor[b[i][j]]ですが、「合計の処理」などで1~5の整数が代入されています。
配列の添え字は、0起算です。配列の和を5にしたなら、0~4を入れて下さい。

投稿2019/11/14 13:17

Q71

総合スコア995

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問