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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

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

Python

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

Q&A

解決済

1回答

10815閲覧

描画を重ねるごとに動作が重くなるのをコーディングで解消したい

3109

総合スコア80

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

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

Python

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

0グッド

0クリップ

投稿2018/07/29 11:09

大澤文孝氏著「いちばんやさしいPython入門教室」を
読んでPythonを勉強しています。

本に示されているサンプルを写して実行し、
動作を確かめていたのですが、
図形がCanvas上で往復動作を繰り返す下記のプログラム
"example07-05-01.py"(200頁に掲載)から
描画を重ねるごとに動作が重くなるようになりました。

コーディングによって、これを解消することは可能でしょうか?

Python

1# coding:utf-8 2import tkinter as tk 3 4# 円の座標と半径 5x = 400 6y = 300 7# 移動量 8dx = 1 9 10def move(): 11 global x, y, dx 12 # いまの円を消す 13 canvas.create_oval(x - 20, y - 20, x + 20, y + 20, fill="white", width=0) 14 # X座標を動かす 15 x = x + dx 16 # 次の位置に円を描く 17 canvas.create_oval(x - 20, y - 20, x + 20, y + 20, fill="red", width=0) 18 # 端を超えていたら反対向きにする 19 if x >= canvas.winfo_width(): 20 dx = -1 21 if x <= 0: 22 dx = +1 23 # 再びタイマー 24 root.after(10, move) 25 26# ウィンドウを描く 27root = tk.Tk() 28root.geometry("600x400") 29 30# キャンバスを置く 31canvas =tk.Canvas(root, width =600, height =400, bg="white") 32canvas.place(x = 0, y = 0) 33 34# タイマーを設定する 35root.after(10, move) 36 37root.mainloop()

実現したいこと

プログラム開始直後の一定のスピードを保つように変えたいです。

このプログラムを派生させていろいろと試したいのですが、
だんだん動きの鈍くなるものは作りたいプログラムではありません。

パソコンのメモリを増設するなどのハード面からの解消方法ではなく、
コーディングによって解決できるのであれば、
その方法をご教示いただきたいと思います。

自分で試したこと

「Python オブジェクト 解放」でキーワード検索をおこなってみましたが、
自分で理解して解決することはできませんでした。

また、本ケースの円が動くプログラムが掲載されたChapter7を
最後まで読み進めば上位例が示されるかと思ったのですが、
サンプルが複雑になるに従って重くなるのが早まるだけでした。

利用している環境

OS: Windows7 Professional バージョン6.1
version: Python 3.6.4 32bit
IDE: IDLE(Python 3.6 32-bit)


よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

そのコードはオブジェクトの描画を消すときに、ほんとうの意味で「消して」いる訳ではありません。同じ位置に同じ形の白いオブジェクトを書いて塗りつぶしているだけです。

管理するオブジェクトが増えるに従って、遅くなるのは当然。

こんな感じでどうでしょうか。

python

1# coding:utf-8 2import tkinter as tk 3 4# 円の座標と半径 5x = 400 6y = 300 7# 移動量 8dx = 1 9 10def move(): 11 global x, y, dx 12 # いまの円を消す 13 canvas.delete("oval") # 最初の1回呼ばれたときは存在しないtagに対して消すことになるが、動くには動くっぽい 14 # X座標を動かす 15 x = x + dx 16 # 次の位置に円を描く 17 canvas.create_oval(x - 20, y - 20, x + 20, y + 20, fill="red", width=0, tag="oval") 18 # 端を超えていたら反対向きにする 19 if x >= canvas.winfo_width(): 20 dx = -1 21 if x <= 0: 22 dx = +1 23 # 再びタイマー 24 root.after(10, move) 25 26# ウィンドウを描く 27root = tk.Tk() 28root.geometry("600x400") 29 30# キャンバスを置く 31canvas =tk.Canvas(root, width =600, height =400, bg="white") 32canvas.place(x = 0, y = 0) 33 34# タイマーを設定する 35root.after(10, move) 36 37root.mainloop() 38

その本は読んだことがありませんが、ずっとその調子で続くなら、たぶんあまり良くない本なのでそれ以上付き合うのはやめておいた方が良いでしょう。

参考:
【Python】Tkinterのcanvasを使ってみる

投稿2018/07/29 11:34

hayataka2049

総合スコア30933

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

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

3109

2018/07/29 12:17

ありがとうございます! 実現したかったイメージ通りに動作しました。 5分回しても人の目には違いが感じられませんでした。 本には "「消す」というのはわかりにくいですが、 「消えたように見せる」ようにプログラムを作ります。 いくつか考え方はありますが…(中略)… 白い円を描画する」という方法が簡単です。" とあり、いくつか方法を示してくれるのかなと 付き合ってみたのですが… オブジェクトの振る舞いを知る材料にはなりました。 hayataka2049様、 参考サイトまで示してくださり、ありがとうございます。 スピードスナイプ感謝いたします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問