質問: 0) # タイマーを設定する root.after(10, move) root.mainloop() ``` ### 実現したいこと プログラム開始直後の**一定のスピードを保つように変えたい**です。 このプログラムを派生させていろいろと試したいのですが、 だんだん動きの鈍くなるものは作りたいプログラムではありません。 パソコンのメモリを増設するなどのハード面からの解消方法ではなく、 コーディングによって解決できるのであれば、 その方法をご教示いただきたいと思います。 ### 自分で試したこと 「Python オブジェクト 解放」でキーワード検索をおこなってみましたが、 自分で理解して解決することはできませんでした。 また、本ケースの円が動くプログラムが掲載されたChapter7を 最後まで読み進めば上位例が示されるかと思ったのですが、 サンプルが複雑になるに従って重くなるのが早まるだけでした。 ### 利用している環境 OS: Windows7 Professional バージョン6.1 version: Python 3.6.4 32bit IDE: IDLE(Python 3.6 32-bit) --- よろしくお願いします。
回答: そのコードはオブジェクトの描画を消すときに、ほんとうの意味で「消して」いる訳ではありません。同じ位置に同じ形の白いオブジェクトを書いて塗りつぶしているだけです。 管理するオブジェクトが増えるに従って、遅くなるのは当然。 こんな感じでどうでしょうか。 ``` # coding:utf-8 import tkinter as tk # 円の座標と半径 x = 400 y = 300 # 移動量 dx = 1 def move(): global x, y, dx # いまの円を消す canvas.delete("oval") # 最初の1回呼ばれたときは存在しないtagに対して消すことになるが、動くには動くっぽい # X座標を動かす x = x + dx # 次の位置に円を描く canvas.create_oval(x - 20, y - 20, x + 20, y + 20, fill="red", width=0, tag="oval") # 端を超えていたら反対向きにする if x >= canvas.winfo_width(): dx = -1 if x <= 0: dx = +1 # 再びタイマー root.after(10, move) # ウィンドウを描く root = tk.Tk() root.geometry("600x400") # キャンバスを置く canvas =tk.Canvas(root, width =600, height =400, bg="white") canvas.place(x = 0, y = 0) # タイマーを設定する root.after(10, move) root.mainloop() ``` その本は読んだことがありませんが、ずっとその調子で続くなら、たぶんあまり良くない本なのでそれ以上付き合うのはやめておいた方が良いでしょう。 参考: 【Python】Tkinterのcanvasを使ってみる