🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Tkinter

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

Python

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

Q&A

解決済

1回答

4556閲覧

Python afterを実行した際に出るエラー invalid command name while executing

退会済みユーザー

退会済みユーザー

総合スコア0

Tkinter

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

Python

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

0グッド

0クリップ

投稿2021/01/23 05:09

お世話になります。参考書を読みながら勉強を進めている中、「ウィンドウの中で赤い円を左から右に移動させる」という課題が出てきました。その中でtkinterのafterメソッドを使い、0.01秒毎に関数を実行して円のX座標を1ずつ動かしていくという方法で赤い円が左から右へ動くように見せるというコードの書き方が載っていました。そのコードを実際書いて実行してみたのですが、確かに赤い円がウィンドウ内で左から右へ動くという動作は実行されたのですが、何故かエラーが表示されてしまいます。エラー表示から予想して、afterメソッドに関係していると思いネットで調べてみたのですが、これといった解決法は見つけられませんでした。実行したい動作が一応は実現できているのですが、やはりどこが間違っているのかを知りたいと思っております。コードは参考書に書かれているものそのもので、自分で加えた部分などはありません。よろしくお願いいたします。

コード

Python

1import tkinter as tk 2 3#円の座標 4x=400 5y=300 6 7 8def move(): 9 global x,y 10 #今の円を消す 11 canvas.create_oval(x - 20, y - 20, x + 20, y + 20, fill="white", width=0) 12 #x座標を動かす 13 x=x+1 14 #次の位置に円を描く 15 canvas.create_oval(x - 20, y - 20, x + 20, y + 20, fill="red", width=0) 16 #再びタイマー 17 root.after(10, move) 18 19#ウィンドウを描く 20root=tk.Tk() 21root.geometry("600x400") 22 23 24#キャンバスを置く 25canvas=tk.Canvas(root, width=600, height=400, bg="white") 26canvas.place(x=0, y=0) 27 28#タイマーを設定する 29root.after(10, move) 30 31 32root.mainloop()

エラー表示

invalid command name "2177458294528move"
while executing
"2177458294528move"
("after" script)
invalid command name "2177448788288move"
while executing
"2177448788288move"
("after" script)
invalid command name "2177458294528move"
while executing
"2177458294528move"
("after" script)
invalid command name "2177443823744move"
while executing
"2177443823744move"
("after" script)
invalid command name "2177448776512move"
while executing
"2177448776512move"
("after" script)
invalid command name "2177448776512move"
while executing
"2177448776512move"
("after" script)
invalid command name "2177458121408move"
while executing
"2177458121408move"
("after" script)
invalid command name "2177458121280move"
while executing
"2177458121280move"
("after" script)
invalid command name "2177458121280move"
while executing
"2177458121280move"
("after" script)
invalid command name "2177448376320move"
while executing
"2177448376320move"
("after" script)
invalid command name "2177458120256move"
while executing
"2177458120256move"
("after" script)
invalid command name "2177458756288move"
while executing
"2177458756288move"
("after" script)
invalid command name "2177458755904move"
while executing
"2177458755904move"
("after" script)
invalid command name "2177458294528move"
while executing
"2177458294528move"
("after" script)
invalid command name "2177458276864move"
while executing
"2177458276864move"
("after" script)
invalid command name "2177458755904move"
while executing
"2177458755904move"
("after" script)
invalid command name "2177458294528move"
while executing
"2177458294528move"
("after" script)
invalid command name "2177458119680move"
while executing
"2177458119680move"
("after" script)
invalid command name "2177458276864move"
while executing
"2177458276864move"
("after" script)
invalid command name "2177448788288move"
while executing
"2177448788288move"
("after" script)
invalid command name "2177458276864move"
while executing
"2177458276864move"
("after" script)
invalid command name "2177448678144move"
while executing
"2177448678144move"
("after" script)
invalid command name "2177448664896move"
while executing
"2177448664896move"
("after" script)

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

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

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

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

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

ppaul

2021/01/23 05:23

私のところでは正常に動作しました。 OS、Pythonのバージョン、Tkinterのバージョンを掲示してください。
退会済みユーザー

退会済みユーザー

2021/01/23 16:16

ppaul様 ありがとうございます。OSはWindows、Pythonは3.8、Tkinterは8.6を使っております。参考書に書かれていたAnacondaのサイトでダウンロードしました。
guest

回答1

0

ベストアンサー

エラーとは関係ない部分ですが
現在の実装では色を別の色で上塗りして、見た目を隠す事になっていて
move() の度にオブジェクトが2つ生成され蓄積されてます。

  • create_oval は最初に一度のみ呼び出し、戻り値を控えておきます
  • オブジェクトを移動するには、canvas.move を使います。
  • もしくは、もし削除するのであれば canvas.delete を使ってください。

python

1import tkinter as tk 2 3#円の座標 4x=400 5y=300 6 7def move(): 8 ### (1) x座標に +1 移動 9 canvas.move(ball, 1, 0) 10 root.after(10, move) 11 12#ウィンドウを描く 13root=tk.Tk() 14root.geometry("600x400") 15 16#キャンバスを置く 17canvas=tk.Canvas(root, width=600, height=400, bg="white") 18canvas.place(x=0, y=0) 19 20### (2) 円形のオブジェクトを生成 21ball = canvas.create_oval(x - 20, y - 20, x + 20, y + 20, fill="red", width=0) 22 23root.after(10, move) 24root.mainloop() 25

エラー内容については、実行環境の問題ではないでしょうか。
書籍の時点での対象バージョンや環境の確認をお勧めします。


追記: Anaconda3/python3.7.9/win10
コマンドプロンプトからの実行では、エラーは確認できませんでした。

投稿2021/02/07 08:08

編集2021/02/07 08:26
teamikl

総合スコア8738

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

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

退会済みユーザー

退会済みユーザー

2021/02/07 16:21

teamikl様 ご丁寧なアドバイスありがとうございます。 確かに、参考書に書かれた通りでは白い円と赤い円が書かれ続けて、赤い円が移動しているように見えるプログラムになっていますね。見た目では思った通りの動作が実行されているので、これで良いかなと思っていたのですが、データとしてはそれが蓄積されているのだとまで考えが及びませんでした。教えていただいた考え方でもう一度自分でプログラムを書いてみます。 エラーの件は、仰る通り実行環境に関係しているような気がします。そちらももう一度確認してみる事にします。
teamikl

2021/02/08 08:08

参考までに聞いておきたいのですが、コードはどのように実行されましたか? コマンドライン上で実行。エディタやIDE等のアプリ内で実行、等 ---- 恐らく同じ書籍からの出典で、同じようなコードがありました。 (エラーに関する質問ではありません) 描画を重ねるごとに動作が重くなるのをコーディングで解消したい https://teratail.com/questions/138485 Python, Tkinterで処理が重くなる https://teratail.com/questions/166111 ※ 書籍のサポート・サイト等を調べるとエラッタが公表されてる場合もあります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問